即使是不成熟的尝试,也胜于胎死腹中的策略。

es-scroll迭代问题

Elasticsearch | 作者 elasticStack | 发布于2019年01月17日 | 阅读数:4581

1.版本6.5.4 + Python
2.es有个scroll api, 然后scan是scroll的简单实现,但是我根据scan写了一个导出接口,
完全是不可控的呀, 并没有返回scorll_id用于迭代的, 比如我给个条件, scan就把50W数据下载下来了,
我现在想要控制这个过程, 拿到scrol_id, 下次查询把scroll_id传过来, 迭代查询怎么做??

导出.jpg


scan说明.png

 
已邀请:

rochy - rochy_he

赞同来自: elasticStack

那你就需要自己使用 scroll api 来进行导出了
scan 是直接把你需要的 top n 的数据导出,没有更多操作了

God_lockin

赞同来自:

印象里封装好的python客户端是直接返回迭代器而不像Java client一样返回response自己解析scrollId的,同时还少了不少可以配置的东西…
 
那么反过来,你可以直接自己重新封装一个工具类来处理这种需求,你可以看到普通的DSL通过curl请求的时候是可以拿到scrollId的,那么也可以模拟这种方式来请求。
 
这样做的好处就是比较自由一点,毕竟ES本来就是基于restful的应用,但是坏处也很明显,需要自己组合DSL、需要自己解析response…看你自己权衡着来了
 
还有,scroll是有超时时间的,而且不能多线程滚,不然会造成顺序有问题,可以考虑一下这种load数据是不是可以用别的方式实现,比如search after之类的

puyunjiafly

赞同来自:

es_scroll = scan(es_client, query={}, index="facebook_eye_people", doc_type="people", scroll='60m', request_timeout=6000)
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流程
不然很容易出问题。
 

要回复问题请先登录注册