Angenommen, ich habe einen Index für Autos auf der Autohalle eines Händlers. Jedes Dokument ähnelt dem folgenden:
%Vor%Angenommen, ich habe eine Million Autos.
Angenommen, ich möchte eine Ansicht der zuletzt hinzugefügten 1000 Autos zusammen mit Facetten über diesen 1000 Autos präsentieren.
Ich könnte einfach from
und size
verwenden, um die Ergebnisse bis zu einem festen Limit von 1000 zu paginieren, aber dabei die Gesamtsummen und Facetten auf model_year
und color
(dh Aggregationen), von denen ich zurückkomme Elasticsearch sind nicht richtig - sie sind über die gesamte übereinstimmende Menge.
Wie beschränke ich meine Suche auf die zuletzt hinzugefügten 1000 Dokumente für Paginierung und Aggregation?
Wie Sie wahrscheinlich in der Dokumentation gesehen haben, werden die Aggregationen für den Umfang der Abfrage selbst durchgeführt. Wenn keine Abfrage erfolgt, werden die Aggregationen in einer match_all
-Liste der Ergebnisse durchgeführt. Selbst wenn Sie size
auf Abfrageebene verwenden würden, erhalten Sie immer noch nicht, was Sie benötigen, denn size
ist nur eine Möglichkeit, eine Menge von Dokumenten aus allen Dokumenten zurückzugeben, die mit der Abfrage übereinstimmen . Aggregationen funktionieren nach Übereinstimmung der Abfrage.
Diese Feature-Anfrage ist nicht neu und wurde schon vor einiger Zeit abgefragt.
In 1.7 gibt es keine direkte Lösung. Vielleicht können Sie den Limit-Filter oder terminate_after In-Body-Request-Parameter, aber dies wird nicht die Dokumente zurückgeben das war auch sortiert. Dadurch erhalten Sie die erste terminate_after
Anzahl der Dokumente, die der Abfrage entsprechen, und diese Anzahl pro Shard. Dies wird nicht ausgeführt, nachdem die Sortierung angewendet wurde.
In ES 2.0 gibt es auch die Sampler-Aggregation , die mehr oder weniger wie die terminate_after
funktioniert, aber diese berücksichtigt die Punktzahl der Dokumente, die von jedem Shard berücksichtigt werden sollen. Wenn Sie nur nach date_added
sortieren und die Abfrage nur ein match_all
ist, haben alle Dokumente die gleiche Punktzahl und es wird eine irrelevante Menge von Dokumenten zurückgegeben.
Fazit:
es gibt keine gute Lösung dafür, es gibt Workarounds mit der Anzahl der Dokumente pro Shard. Also, wenn Sie 1000 Autos wollen, dann müssen Sie diese Zahl durch die Anzahl der primären Shards teilen, verwenden Sie es in sampler
Aggregation oder mit terminate_after
und erhalten Sie eine Reihe von Dokumenten
Mein Vorschlag ist, eine Abfrage zu verwenden, um die Anzahl der Dokumente (Autos) nach anderen Kriterien zu begrenzen . Zum Beispiel, zeigen Sie (und aggregieren Sie) die Autos in den letzten 30 Tagen oder etwas ähnliches. Das bedeutet, dass die Kriterien in die Abfrage selbst aufgenommen werden sollten, damit der resultierende Satz von Dokumenten derselbe sein kann, der aggregiert werden soll. Es ist nicht einfach, Aggregationen auf eine bestimmte Anzahl von Dokumenten anzuwenden, nachdem sie sortiert wurden.
Tags und Links elasticsearch pagination faceted-search