web-dev-qa-db-ja.com

elasticsearch-pyスキャンおよびスクロールしてすべてのドキュメントを返す

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
_

enter image description here _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>_が返されます。このため、私はスクロールを何とか台無しにしていることは比較的確信していますが、どこでどのように修正するかはわかりません。

結果: enter image description here 繰り返しますが、_scroll/_の後、スクロールIDを提供し、?scroll=10m (Caused by <class 'httplib.BadStatusLine'>: ''))で終わります。

トランスポートクラスのMaxの再試行回数を増やしてみましたが、違いはありませんでした。

注:私のESは同じネットワーク上のリモートデスクトップにあります。

22
drowningincode

python scanメソッドは、残りのAPIへのGET呼び出しを生成しています。httpを介してscroll_idを送信しようとしています。ここで最も可能性の高いケースは、scroll_idが大きすぎて送信できないhttpなどの応答が返されないため、このエラーが表示されます。

Scroll_idは所有するシャードの数に基づいて大きくなるため、POSTを使用し、リクエストの一部としてJSONでscroll_idを送信することをお勧めします。この方法で制限を回避できます。 HTTP呼び出しには大きすぎます。

10
chrstahl89

問題は解決しましたか?

1つの簡単な解決策があります。scroll_id以下のようなscrollメソッドを呼び出すたびに:

response_tmp = es.scroll(scroll_id=scrollId, scroll= "1m")

scrollId = response_tmp['_scroll_id']
1
zhaochl