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
_
残念ながら、スキャンとスクロールを実装しようとして、問題に遭遇したすべてのドキュメントを取得できました。 2つの異なる方法で試しましたが、成功しませんでした。
方法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は同じネットワーク上のリモートデスクトップにあります。
python scanメソッドは、残りのAPIへのGET呼び出しを生成しています。httpを介してscroll_idを送信しようとしています。ここで最も可能性の高いケースは、scroll_idが大きすぎて送信できないhttpなどの応答が返されないため、このエラーが表示されます。
Scroll_idは所有するシャードの数に基づいて大きくなるため、POSTを使用し、リクエストの一部としてJSONでscroll_idを送信することをお勧めします。この方法で制限を回避できます。 HTTP呼び出しには大きすぎます。
問題は解決しましたか?
1つの簡単な解決策があります。scroll_id
以下のようなscrollメソッドを呼び出すたびに:
response_tmp = es.scroll(scroll_id=scrollId, scroll= "1m")
scrollId = response_tmp['_scroll_id']