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

标签 python elasticsearch

我正在使用 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

不幸的是,当我尝试执行扫描和滚动以便获取遇到问题的所有文档时。我尝试了两种不同的方法,但没有成功。

方法一:

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

enter image description here 之后scroll/它给出了滚动 ID,然后以 ?scroll=10m (Caused by <class 'httplib.BadStatusLine'>: '')) 结束

方法二:

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,我会得到 <generator object scan at 0x108723dc0> .因此,我相对确定我的滚动条以某种方式搞砸了,但我不确定在哪里或如何修复它。

结果: enter image description here 再次,在 scroll/ 之后它给出了滚动 ID,然后以 ?scroll=10m (Caused by <class 'httplib.BadStatusLine'>: '')) 结束

我尝试增加传输类的最大重试次数,但这并没有什么不同。我非常感谢任何有关如何解决此问题的见解。

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

最佳答案

python 扫描方法正在生成对 rest api 的 GET 调用。它正在尝试通过 http 发送您的 scroll_id。最可能的情况是您的 scroll_id 太大而无法通过 http 发送,因此您会看到此错误,因为它没有返回任何响应。

因为 scroll_id 会根据您拥有的分片数量而增长,所以最好使用 POST 并以 JSON 格式发送 scroll_id 作为请求的一部分。这样你就可以绕过它对于 http 调用来说太大的限制。

关于python - elasticsearch-py 扫描并滚动返回所有文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22921629/

相关文章:

kibana - 带有求和的Elasticsearch日期范围聚合

python - 使用 Robot Framework 中的内置函数的自定义关键字中出现预期错误

python - Python 中的梯度下降

python - Pyspark - 如何将 '4 hours' 多个窗口分组聚合

ruby-on-rails - curl 请求时,Rails Elasticsearch 不返回任何命中

elasticsearch - 在Elasticsearch中使用ngram标记器按部分用户名或名称搜索用户的正确方法

c# - 使用Elasticsearch 7.1的NEST 7.0 alpha 2中的SortField

linux - 断开 SSH session 后使 Kibana 4 保持运行

Python-Django : user info in template

python - Google 有针对 Python 的官方图像 API 吗?