54

結果は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 に設定しましたが、すべてのデータを取得できるように無制限にしたくありません。データが変化し続け、すべてのデータを取得したいので、制限を設定できません。

4

4 に答える 4

36

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

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

于 2013-01-18T14:46:10.177 に答える
13

もう 1 つの方法は、最初に を実行しsearchType: 'count'、次にsizeset toで通常の検索を実行することresults.countです。

ここでの利点は、この同様の SO の質問UPPER_BOUNDで示唆されているように、マジック ナンバーに依存することを回避し、Shay Banon がここで説明している、大きすぎるプライオリティ キューを構築することによる余分なオーバーヘッドを回避することです。とは異なり、結果を並べ替えておくこともできます。scan

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

于 2015-09-23T19:26:33.133 に答える
10

docsから、「デフォルトで10,000に設定されているインデックス設定をfrom + size超えることはできないことに注意してください」。index.max_result_windowしたがって、私の確かに非常にアドホックな解決策は、引数を使用する場合に渡すsize: 10000か、10,000 マイナスすることです。from

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

于 2016-04-28T22:42:31.660 に答える
7

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

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

ここを参照

于 2013-01-18T10:14:05.313 に答える