web-dev-qa-db-ja.com

PythonでElasticsearchからすべての結果を取得する方法

Elasticsearchを使用するのは初めてで、Pythonスクリプトを使用してElasticsearchクエリを実行すると、すべての結果を取得する際に問題が発生します。私の目標は以下のインデックス( "my_index" )、それらの結果を取得し、それらをpandas DataFrameに入れます。これはDjangoアプリを通過し、最終的にはWord文書になります。

私のコードは:

es = Elasticsearch()
logs_index = "my_index"
logs = es.search(index=logs_index,body=my_query)

ヒット数は72だったが、そうすると

df = logs['hits']['hits']
len(df)

長さはたったの10であると言います。誰かが この質問 で同様の問題を抱えているのを見ましたが、彼らの解決策はうまくいきませんでした。

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
es = Elasticsearch()
logs_index = "my_index"
search = Search(using=es)
total = search.count()
search = search[0:total]
logs = es.search(index=logs_index,body=my_query)
len(logs['hits']['hits'])

Len関数は、まだ10個の結果しかないと言っています。私は何を間違えていますか、または72の結果をすべて戻すために他に何ができますか?

ETA:クエリに「サイズ」:10000を追加して、10に切り捨てないようにすることができることは承知していますが、ユーザーが検索クエリを入力するので、他の方法を見つける必要があります検索クエリー。

9
carousallie

sizeパラメーターをes.search()呼び出しに渡す必要があります。

APIドキュメント をお読みください

size –返されるヒット数(デフォルト:10)

例:

es.search(index=logs_index, body=my_query, size=1000)

これは、すべてのインデックスドキュメントまたは大量のドキュメントを返すクエリを取得する最適な方法ではないことに注意してください。そのためには、scroll操作を実行する必要があります。この操作は、scroll Elastic操作の抽象化 scan() で提供されるAPIドキュメントにも記載されています。

elasticsearch documentation でそれについて読むこともできます

5
Alexandre Juma

sizeを明示的に設定する(ドキュメントの数が比較的少ない場合)か、scan関数を使用して、多数のドキュメントのようなカーソルを使用する必要があります。

スキャン

1
Samaksh Jain