web-dev-qa-db-fra.com

Définition de la limite de recherche élastique sur "illimité"

Comment puis-je obtenir tous les résultats de la recherche élastique, car les résultats ne s'affichent que dans la limite de 10 uniquement. J'ai eu une requête comme:

@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

j'ai fixé la limite à 15, mais je ne veux pas la rendre illimitée pour pouvoir obtenir toutes les données. Je ne peux pas définir la limite, car mes données ne cessent de changer et je souhaite obtenir toutes les données.

40
Sumit Rai

Vous pouvez utiliser les paramètres from et size pour parcourir toutes vos données. Cela peut être très lent en fonction de vos données et de la quantité d'index.

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

29
Zach

Une autre approche consiste à faire d'abord un searchType: 'count', Puis une recherche normale avec size réglé sur results.count.

L'avantage ici est qu'il évite de dépendre d'un nombre magique pour UPPER_BOUND Comme suggéré dans cette question SO similaire , et évite la surcharge supplémentaire liée à la construction d'une file d'attente prioritaire trop volumineuse que Shay Banon décrit ici . Cela vous permet également de garder vos résultats triés, contrairement à scan.

Le plus gros inconvénient est qu'il nécessite deux demandes. Selon votre situation, cela peut être acceptable.

8
David

Dans docs , "Notez que from + size ne peut pas être plus que le index.max_result_window réglage de l’index qui prend la valeur par défaut 10 000 ". Ma solution, certes très ad hoc, consiste donc simplement à passer size: 10000 ou 10 000 moins à partir de si j'utilise l'argument from.

Notez que, après le commentaire de Matt ci-dessous, la bonne façon de procéder si vous avez une plus grande quantité de documents consiste à utiliser le scroll api . J'ai utilisé cela avec succès, mais seulement avec l'interface python.

8
travelingbones

utilisez la méthode de balayage, par exemple.

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

voir ici

7
Rachel Gallen