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.
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
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.
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.
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