Wie berechne ich Facetten / Aggregationen für die Top-n-Dokumente mit Paginierung in Elasticsearch?

9

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?

    
Michael Haren 21.07.2015, 12:15
quelle

1 Antwort

1

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.

Andrei Stefan 10.09.2015 00:02
quelle