2015-07-21 10 views
9

Angenommen, ich habe einen Index für Autos auf dem Autohaus eines Händlers. Jedes Dokument ähnelt dem folgenden:Wie berechne ich Facetten/Aggregationen für die Top-n-Dokumente mit Paginierung in Elasticsearch?

{ 
    color: 'red', 
    model_year: '2015', 
    date_added: '2015-07-20' 
} 

nehme ich eine Million Autos.

Angenommen, ich möchte einen Blick auf die zuletzt hinzugefügten 1000 Autos, zusammen mit Facetten über diese 1000 Autos.

Ich konnte einfach from und size nutzen die Ergebnisse bis zu einer festgelegten Grenze von 1000 Paginieren, aber so die Summen und Facetten auf model_year und color (dh Aggregationen) bekomme ich zurück von Elasticsearch sind nicht right-- dabei Sie sind über das gesamte Matched-Set verteilt.

Wie beschränke ich meine Suche auf die zuletzt 1000 Dokumente für Paginierung und Aggregation hinzugefügt?

+0

zeigen Ihnen die Abfrage Sie verwenden? – Val

+0

@ Val- die Abfrage Teil ist nicht so interessant und könnte sogar ein Match-alles sein. z.B. '{ "sort": { "DATE_ADDED": { "order": "desc" } } }' –

+0

Paginierung ist [nicht möglich] (https://github.com/elastic/elasticsearch/issues/4915) für das Ergebnis einer Aggregation. –

Antwort

1

Wie Sie wahrscheinlich in der Dokumentation gesehen haben, werden die Aggregationen für den Bereich der Abfrage selbst durchgeführt. Wenn keine Abfrage erfolgt, werden die Aggregationen in einer match_all Ergebnisliste durchgeführt. Auch wenn Sie size auf der Abfrageebene verwenden würden, wird es Ihnen immer noch nicht geben, was Sie brauchen, denn size ist nur ein Weg Rückgabe eines Satzes von Dokumenten aus allen Dokumenten die Abfrage übereinstimmte. Aggregationen wirken auf die Übereinstimmung der Abfrage.

Diese Feature-Anfrage ist nicht neu und wurde vor einiger Zeit asked for before.

In 1.7 gibt es keine direkte Lösung. Vielleicht können Sie die limit filter oder terminate_after In-Body-Request-Parameter verwenden, aber das wird nicht die Dokumente zurückgeben, die auch sortiert wurden. Dadurch erhalten Sie die ersteterminate_after Anzahl der Dokumente, die die Abfrage und diese Anzahl pro Shard entspricht. Dies wird nicht durchgeführt, nachdem die Sortierung angewendet wurde.

In ES 2.0 gibt es auch die sampler aggregation, die mehr oder weniger genauso funktioniert wie die terminate_after funktioniert, aber diese berücksichtigt die Punktzahl der Dokumente von jedem Shard berücksichtigt werden. Wenn Sie nur nach date_added sortieren und die Abfrage ist nur ein match_all alle Dokumente werden die gleiche Punktzahl haben und es wird eine irrelevante Menge von Dokumenten zurückgeben.

Fazit:

  • es keine gute Lösung dafür ist, gibt es Abhilfen mit der Anzahl der Dokumente pro Shard. Also, wenn Sie 1000 Autos wollen, dann müssen Sie diese Nummer nehmen teilen sie durch die Anzahl der primären Shards, verwenden Sie es in sampler Aggregation oder mit terminate_after und eine Reihe von Dokumenten erhalten

  • mein Vorschlag ist, zu Verwendung ein Abfrage, um die Anzahl der Dokumente (Autos) nach einem anderen Kriterium zu begrenzen stattdessen. 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. Aggregationen auf eine bestimmte Anzahl von Dokumenten anzuwenden, nachdem sie sortiert wurden, ist nicht einfach.

Verwandte Themen