In diesem Abschnitt lernen Sie ein von Filtern abgeleitetes Muster kennen, das in Suchimplementierungen weit verbreitet ist und als Facettensuche bezeichnet wird. Die Idee besteht darin, dem Benutzer eine Abfrage auszuführen und ihm anschließend zusammen mit den Ergebnissen eine Liste mit Filtervorschlägen zu präsentieren.

Der folgende Screenshot zeigt eine linke Seitenleiste mit Facetten für die beiden Filter, die aktuell in der Anwendung implementiert sind.

Hier ein Detail der facettierten Suchergebnisse. Beachten Sie, wie jeder Eintrag als anklickbarer Link dargestellt wird, der den Filter zur aktuellen Suche hinzufügt. Jedes Gesicht zeigt außerdem an, wie viele Ergebnisse es enthält.

Termaggregationen

In Elasticsearch wird die Facettensuche mithilfe der Aggregationsfunktion implementiert. Eine der unterstützten Aggregationen teilt die Suchergebnisse anhand bestimmter Kriterien in Gruppen auf. Die Liste der Buckets, die jeweils die Anzahl der darin enthaltenen Dokumente enthält, wird zur Darstellung der Facetten-Seitenleiste verwendet.

Die einfachste Art der Bucket-Aggregation ist diejenige, bei der für jedes Schlüsselwort ein Bucket definiert wird. Dieser Typ, der als Termaggregation bezeichnet wird, eignet sich perfekt, um die Buckets für das Feld category zu erstellen. Hier ist die Suchanfrage der Anwendung, erweitert um die Abfrage von Kategorieaggregationen:

Die einzige Änderung besteht in der Hinzufügung der Option aggs . Jeder Aggregation wird ein Name gegeben, in diesem Fall category-agg. Die terms -Aggregation bedeutet, dass die Filterung nach Schlüsselwörtern erfolgen soll. Wie bei Filtern muss das Feld category als category.keyword angegeben werden, damit der mit dem Feld verknüpfte Schlüsselwort-Subtyp verwendet wird.

Die Antwort auf eine Anfrage mit Aggregationen enthält ein Feld aggregations mit den aggregierten Ergebnissen. So könnte die Antwort auf die obige Beispielanfrage aussehen:

Die mit der Tutorial-Anwendung mitgelieferte index.html- Vorlage ist bereits so konzipiert, dass sie Aggregationen in der linken Seitenleiste anzeigt, die bis zu diesem Zeitpunkt leer war. Um die Template-Logik einfach zu halten, müssen die Daten aus der obigen Antwort in ein Wörterbuch mit folgender Struktur umgewandelt werden:

Die nächste Auflistung zeigt, wie das Elasticsearch-Aggregationsformat in das oben genannte vereinfachte Wörterbuch konvertiert wird und wie das konvertierte Wörterbuch zur Darstellung an die Vorlage gesendet wird:

Falls es Sie interessiert: Die index.html enthält die folgende Logik zum Rendern des aggs -Wörterbuchs:

Diese Implementierung verwendet ähnliche Ideen wie die Schaltflächen für die nächste und vorherige Seitennavigation. Jede Facette wird als Formular mit einem versteckten Feld dargestellt, das die Abfrage mit dem entsprechenden hinzugefügten Filter definiert. Beispielsweise würde eine sharepoint -Kategoriefacette category:sharepoint zur aktuellen Abfrage hinzufügen.

Als rein kosmetisches Detail ist der Absenden-Button in jeder Facette als Link gestaltet.

Jahresaggregationen

Die in Verbindung mit den Kategorien verwendeten Begriffsaggregationen funktionieren nicht für den im vorherigen Abschnitt erstellten Jahresfilter, da, wie Sie sich erinnern, der Index die Jahre nicht einzeln als Schlüsselwörter speichert. Stattdessen wird das Jahr, in dem jeder Artikel aktualisiert wurde, durch das Feld updated_at definiert, das ein vollständiges Datum speichert.

Aus der langen Liste der verfügbaren Bucket-Aggregationen ist das Datumshistogramm diejenige, die am besten zu diesem Anwendungsfall passt. Hier ist die aktualisierte Aggregationsanfrage:

Hier können Sie sehen, dass dem Feld aggs eine zweite Aggregation hinzugefügt wurde. Der Typ dieser Aggregation ist date_histogram und das Intervall ist auf year eingestellt, sodass die erstellten Buckets jeweils ein Jahr repräsentieren. Mit der Option format wird das Format für den Namen jedes Buckets konfiguriert, der in diesem Fall nur das Jahr enthalten soll.

Das Feld aggregations in der Antwort wird nun zwei Abschnitte enthalten:

Bei dieser zweiten Aggregation gibt es noch eine weitere kleine Komplikation. Das Feld key , das jedem Bucket beiliegt, ist nicht nützlich, da es bei Datumsintervallaggregationen in Millisekunden angegeben wird. Zum Glück wird das Datum, das im Format der Option format in der Aggregation angezeigt wird, in einem Feld key_as_string bereitgestellt.

So wird das aggs -Wörterbuch einschließlich aller Facetten berechnet:

Zusätzlich zur Verwendung von key_as_string anstelle von key wird für die Jahresfacetten eine Bedingung hinzugefügt, um alle Buckets zu eliminieren, die keine Dokumente enthalten, da es offensichtlich keinen Sinn macht, sie als Filter zu verwenden.

Und damit ist die Implementierung der Facettensuche abgeschlossen. Hier ist die vollständige Implementierung der handle_search() -Funktion:

Die in diesem Tutorial enthaltene Implementierung der Facettensuche wurde mit Blick auf Einfachheit konzipiert. Die Aggregationen in Elasticsearch bieten viele Möglichkeiten, die hier nicht behandelt wurden. Lesen Sie daher unbedingt die Dokumentation , um alle Funktionen kennenzulernen.

Herzlichen Glückwunsch, Sie haben das Ende des Abschnitts „Volltextsuche“ dieses Tutorials erreicht! Klicken Sie hier , um den aktuellen Status der Tutorial-Suchanwendung einzusehen.

Vorher

Filter

Nächste

Vektorsuche

Sind Sie bereit, hochmoderne Sucherlebnisse zu schaffen?

Eine ausreichend fortgeschrittene Suche kann nicht durch die Bemühungen einer einzelnen Person erreicht werden. Elasticsearch wird von Datenwissenschaftlern, ML-Ops-Experten, Ingenieuren und vielen anderen unterstützt, die genauso leidenschaftlich an der Suche interessiert sind wie Sie. Lasst uns in Kontakt treten und zusammenarbeiten, um das magische Sucherlebnis zu schaffen, das Ihnen die gewünschten Ergebnisse liefert.

Probieren Sie es selbst aus