我使用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 <class 'httplib.BadStatusLine'>: ''))
方法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,我会得到<generator object scan at 0x108723dc0>
。因此,我相对确定我会以某种方式弄乱我的卷轴,但我不确定在何处或如何解决它。
结果:
同样,在scroll/
之后,它会给出滚动ID,然后以?scroll=10m (Caused by <class 'httplib.BadStatusLine'>: ''))
我尝试增加传输类的Max重试次数,但这并没有什么区别。我非常感谢任何有关如何解决此问题的见解。
注意:我的ES位于同一网络的远程桌面上。
答案 0 :(得分:9)
python扫描方法正在生成对其余api的GET调用。它试图通过http发送你的scroll_id。这里最可能的情况是你的scroll_id太大而无法通过http发送,因此你看到了这个错误,因为它没有返回任何响应。
因为scroll_id根据你拥有的分片数量而增长,所以最好使用POST并在请求中发送JSON中的scroll_id。通过这种方式,你可以解决它对于http调用来说太大的限制。
答案 1 :(得分:0)
你问题得到了解决吗?
我有一个简单的解决方案,每次调用滚动方法后都必须更改scroll_id
:
response_tmp = es.scroll(scroll_id=scrollId, scroll= "1m")
scrollId = response_tmp['_scroll_id']