我正在使用elasticsearch-py连接到我的ES数据库,该数据库包含300多万个文档。我希望返回所有文档,这样我就可以提取数据并将其写入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'>: ''))
结束
方法二:
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'>: ''))
结束
我试着增加传输类的最大重试次数,但这并没有什么不同。我非常感谢任何关于如何解决这个问题的见解。
注意: My ES位于同一网络上的远程桌面上。
发布于 2014-04-08 22:59:46
python scan方法正在生成对rest api的GET调用。它正在尝试通过http发送您的scroll_id。这里最有可能的情况是您的scroll_id太大,无法通过http发送,因此您会看到此错误,因为它没有返回任何响应。
因为scroll_id是根据您拥有的分片数量增长的,所以最好使用POST并将scroll_id作为请求的一部分发送。这样,您就可以绕过它对于http调用来说太大的限制。
发布于 2017-04-16 10:38:45
你的问题解决了吗?
我有一个简单的解决方案,每次调用scroll方法后,你都必须改变scroll_id
,如下所示:
response_tmp = es.scroll(scroll_id=scrollId, scroll= "1m")
scrollId = response_tmp['_scroll_id']
https://stackoverflow.com/questions/22921629
复制相似问题