web-dev-qa-db-ja.com

Elastic検索の制限を「無制限」に設定する

結果は最大10件までしか表示されないため、エラスティック検索からすべての結果を取得するにはどうすればよいですか。私は次のようなクエリを持っています:

@data = Athlete.search :load => true do
          size 15
          query do
            boolean do
              must { string q, {:fields => ["name", "other_names", "nickname", "short_name"], :phrase_slop => 5} }
              unless conditions.blank?
                conditions.each do |condition|
                  must { eval(condition) }
                end
              end
              unless excludes.blank?
                excludes.each do |exclude|
                  must_not { eval(exclude) }
                end
              end
            end
          end
          sort do
            by '_score', "desc"
          end
        end

私は15に制限を設定しましたが、すべてのデータを取得できるように無制限にしたくないので、データが変化し続けるため、制限を設定できないため、すべてのデータを取得したいです。

40
Sumit Rai

fromおよびsizeパラメーターを使用して、すべてのデータをページングできます。これは、データとインデックスの量によっては非常に遅くなる可能性があります。

http://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.html

29
Zach

別のアプローチは、最初にsearchType: 'count'を実行し、次にsizeresults.countに設定して通常の検索を実行することです。

ここでの利点は、 これに似たSO質問 で提案されているUPPER_BOUNDのマジックナンバーに依存することを回避し、大きすぎる構築の余分なオーバーヘッドを回避することです。 Shay Banonが記述する優先度キューの herescanとは異なり、結果をソートしたままにすることもできます。

最大の欠点は、2つの要求が必要なことです。状況によっては、これが許容される場合があります。

8
David

docs から、「from + sizeは、デフォルトで10,000に設定されているindex.max_result_windowインデックス設定を超えることはできません」したがって、明らかに非常にアドホックなソリューションは、from引数を使用する場合、size: 10000または10,000マイナスfromを渡すことです。 。

以下のMattのコメントに従って、大量のドキュメントがある場合にこれを行う適切な方法は、 scroll api を使用することです。私はこれを正常に使用しましたが、pythonインターフェースのみで使用しました。

8
travelingbones

スキャン方法を使用します。

 curl -XGET 'localhost:9200/_search?search_type=scan&scroll=10m&size=50' -d '
 {
    "query" : {
       "match_all" : {}
     }
 }

こちら をご覧ください

7
Rachel Gallen