Verschachtelte UND und ODER Queries mit Elasticsearch

Verschachtelte UND und ODER Queries mit Elasticsearch

Dies ist der dritte Teil meiner Serie zu elastic search. Im letzten, dem zweiten Teil ging es darum, wie du Dokumente in elastic search indexieren kannst und wie eine einfache abfrage aussehen kann. In diesem Teil soll es darum gehen, wie Anfragen gefiltert werden können und wie diese Filter mit UND / ODER verknüpft werden können.

Elastic Search Index mit Testdaten vorbereiten

Um eine Datenbasis für ein paar Test zu haben indexieren wir für als Beispiel Länder mit Einwohnerzahlen und der Währung die im jeweiligen Land als Zahlungsmittel gilt:

ERROR: Content Element with uid "1983" and type "beautyofcode_contentrenderer" has no rendering definition!

Elastic search Query Filter und Filtered Queries

Im vorherigen Teil haben wir bereits eine einfache Query kennen gelernt, die mittel „match“ in einem Feld sucht.

In einer angepassten query (Teil 2) sieht mit match so aus:

ERROR: Content Element with uid "1985" and type "beautyofcode_contentrenderer" has no rendering definition!

Eine vergleichbare SQL-Query sieht so aus:
 

ERROR: Content Element with uid "1987" and type "beautyofcode_contentrenderer" has no rendering definition!

Im Suchkontext gibt es wichtige bereiche, zum einen das Filtern und zum anderen das Scoring, also in welcher Reihenfolge die Ergebnisse erscheinen.
 

Um optimale Suchergebnisse zu erreichen ist die Reihenfolge der Ergebnisse sehr wichtig. Deshalb bietet elastic hier enstprechend viele Möglichkeiten.

Filter Query

In elastic search gibt es in einer Query zwei Kontexte.

Den Query Context - Das WO: In diesem Kontext sollte man Einschränkungen treffen, die das Scoring betreffen, also die Reihenfolge der Resultate. Es wird durch das „query“ Keyword im Querystring eingeleitet.


Den Filter Context - Das OB: Der Filterkontext trifft Einschränkungen auf die Ergebnismenge, also ob ein Dokument im Ergebnis ist oder nicht.

Elastic empfiehlt, wann immer es geht den Filter Context zu verwenden.

Neben der Query am Anfang, kann man also die selbe Ergebnismenge mit der folgenden Query bekommen:

ERROR: Content Element with uid "1990" and type "beautyofcode_contentrenderer" has no rendering definition!

In diesem Beispiel werden alle Dokumente abgefragt und die Ergebnisdokumente werden gefiltert auf den Term „currency: EUR“.

Das Filtered passiert hier nach der Anfrage. Bei Abfragen die häufig die gleichen Filter enthalten und eine große Ergebnismenge ausschliessen sind "Filtered Queries" zu bevorzugen, weil sie vor der Query ausgeführt werden.

 

Filtered Query

Eine weitere Variante ist die „Filteredquery“. Diese Query schränkt die Ergebnismenge von Begin ein.

 

Gerade bei großen Datenmengen ist diese Variante zu bevorzugen, da sie performater ist als eine "Filter" Anweisung innerhalb der Query.

 

ERROR: Content Element with uid "1993" and type "beautyofcode_contentrenderer" has no rendering definition!

Standardmässig, wenn keine Query angegeben wird, fragt elastic alle Dokumente ab und wendet den Filter an.

Filter mit UND / ODER kombinieren - Boolean Filter mit must und should

Oftmals möchte man mehrer Filter kombinieren mit und oder oder Kombination. In SQL wäre z.b. folgende Abfrage denkbar:

ERROR: Content Element with uid "1996" and type "beautyofcode_contentrenderer" has no rendering definition!

In diesem Fall würden wir erwarten alle Länder die mehr als 60000000 Einwohner haben und die Sprache englisch. Darauf passt in unserem Testdatensatz nur die USA

In Elastic kann man eine solche Query mit einer verschachtelten "boolean" Query erreichen mit "must" werden die beiden Filter kombiniert und mit einem logischen "UND / AND" ausgewertet:

ERROR: Content Element with uid "1998" and type "beautyofcode_contentrenderer" has no rendering definition!

Wenn wir nun die Query mit ODER verbinden, also wie die folgende SQL Query:

ERROR: Content Element with uid "2000" and type "beautyofcode_contentrenderer" has no rendering definition!

Dann würden wir erwarten alle Länder ausser Spanien zurückzubekommen, da jedes entweder mehr als 60000000 Einwohner hat, oder als Sprache english.

Da equivant zu ODER, ist should:

ERROR: Content Element with uid "2002" and type "beautyofcode_contentrenderer" has no rendering definition!

Die war eine erste Vertierung der elastic search query syntax. Ich wünsche viel Spass beim ausprobieren und entdecken von elastic search.

Navigation