当前位置:  开发笔记 > 编程语言 > 正文

elasticsearch-py扫描并滚动以返回所有文档

如何解决《elasticsearch-py扫描并滚动以返回所有文档》经验,为你挑选了1个好方法。

我使用elasticsearch-py连接到包含300多万个文档的ES数据库.我想返回所有文档,以便我可以抽象数据并将其写入csv.我能够使用以下代码轻松完成10个文档(默认返回).

es=Elasticsearch("glycerin")
query={"query" : {"match_all" : {}}}
response= es.search(index="_all", doc_type="patent", body=query)

for hit in response["hits"]["hits"]:
  print hit

不幸的是,当我尝试实现扫描和滚动时,我可以获得所有问题.我尝试了两种不同的方法但没有成功.

方法1:

scanResp= es.search(index="_all", doc_type="patent", body=query, search_type="scan", scroll="10m")  
scrollId= scanResp['_scroll_id']

response= es.scroll(scroll_id=scrollId, scroll= "10m")
print response

在此输入图像描述 之后scroll/它给出滚动id然后结束?scroll=10m (Caused by : ''))

方法2:

query={"query" : {"match_all" : {}}}
scanResp= helpers.scan(client= es, query=query, scroll= "10m", index="", doc_type="patent", timeout="10m")

for resp in scanResp:
    print "Hiya"

如果我在for循环之前打印出scanResp,我得到了.因此,我相对肯定我以某种方式弄乱了我的卷轴,但我不知道在哪里或如何解决它.

结果: 在此输入图像描述 再次,scroll/它给出滚动ID后,然后结束?scroll=10m (Caused by : ''))

我尝试增加传输类的Max重试次数,但这并没有什么区别.我非常感谢任何有关如何解决此问题的见解.

注意:我的ES位于同一网络上的远程桌面上.



1> chrstahl89..:

python扫描方法正在生成对其余api的GET调用.它试图通过http发送你的scroll_id.这里最可能的情况是你的scroll_id太大而无法通过http发送,所以你看到这个错误,因为它没有返回任何响应.

因为scroll_id根据您拥有的分片数量而增长,所以最好使用POST并在请求中发送JSON中的scroll_id.这样你就可以解决它对于http调用来说太大的限制.


事实上这就是错误的来源.事实证明他们已经修复了一段时间,但是如此简单的pip安装--update elasticsearch是问题的官方答案.[make Elasticsearch.scroll POST滚动ID](https://github.com/elasticsearch/elasticsearch-py/pull/28)
推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有