你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
输入关键字进行搜索
搜索:
1.版本6.5.4 + Python 2.es有个scroll api, 然后scan是scroll的简单实现,但是我根据scan写了一个导出接口, 完全是不可控的呀, 并没有返回scorll_id用于迭代的, 比如我给个条件, scan就把50W数据下载下来了, 我现在想要控制这个过程, 拿到scrol_id, 下次查询把scroll_id传过来, 迭代查询怎么做??
没有找到相关结果
rochy - rochy_he
赞同来自: elasticStack
God_lockin
赞同来自:
puyunjiafly
要回复问题请先登录或注册
90后it大数据男
3 个回复
rochy - rochy_he
赞同来自: elasticStack
scan 是直接把你需要的 top n 的数据导出,没有更多操作了
God_lockin
赞同来自:
那么反过来,你可以直接自己重新封装一个工具类来处理这种需求,你可以看到普通的DSL通过curl请求的时候是可以拿到scrollId的,那么也可以模拟这种方式来请求。
这样做的好处就是比较自由一点,毕竟ES本来就是基于restful的应用,但是坏处也很明显,需要自己组合DSL、需要自己解析response…看你自己权衡着来了
还有,scroll是有超时时间的,而且不能多线程滚,不然会造成顺序有问题,可以考虑一下这种load数据是不是可以用别的方式实现,比如search after之类的
puyunjiafly
赞同来自:
for es_data in es_scroll:
es_data 就是返回的一个文档
es_data['_source'] 具体文档
上面代码就是拉取全量数据
scan 返回的迭代器内部做了 scroll的api调用
scroll='60m', request_timeout=6000 是为了防止scroll 超时 及http命令超时导致for中路异常退出,
建议先了解 es scroll 流程,
然后在了解 python elasticsearch-dsl 的scan流程
不然很容易出问题。