Query DSL: die Bool Query im Detail verstehen
AI generated
_doc
_index
Elasticsearch · OpenSearch · Query DSL
Query DSL: die Bool Query im Detail verstehen
must, should, must_not und filter richtig kombinieren

Die Bool Query ist das zentrale Werkzeug der Elasticsearch Query DSL, um mehrere Bedingungen logisch zu verknuepfen. Wer must, should, must_not und filter versteht und weiss, wann Scoring-Kontext gegenueber Filter-Kontext greift, baut Suchanfragen, die sowohl praezise als auch schnell sind, statt einfach alle Klauseln in einen Topf zu werfen und auf gute Ergebnisse zu hoffen.

18 Min. Lesezeit must · should · must_not · filter · minimum_should_match Elasticsearch 8.x · OpenSearch 2.x

1. Was die Bool Query wirklich leistet

Die Bool Query ist der Baustein, mit dem in Elasticsearch und OpenSearch mehrere Bedingungen zu einer einzigen Suchanfrage kombiniert werden. Statt einer einzelnen Query wie match oder term beschreibt die Bool Query eine Kombination aus vier Klauseln: must, should, must_not und filter. Jede dieser vier Klauseln hat eine eigene Bedeutung, ein eigenes Verhalten beim Scoring und eigene Performance-Eigenschaften. Wer die Bool Query nur als "UND-Verknuepfung mehrerer Bedingungen" versteht, verschenkt einen Grossteil ihrer Ausdruckskraft.

In der Praxis begegnet die Bool Query fast jeder nicht-trivialen Suchanfrage: eine Produktsuche, die einen Suchbegriff mit einem Preisfilter und einem Verfuegbarkeits-Flag kombiniert, ist ohne Bool Query kaum sauber abbildbar. Der entscheidende Vorteil gegenueber einer flachen Aneinanderreihung von Bedingungen ist, dass die Bool Query zwischen Bedingungen unterscheidet, die zur Relevanz beitragen sollen, und Bedingungen, die nur filtern sollen, ohne den Score zu beeinflussen. Diese Trennung ist der rote Faden, der sich durch alle folgenden Abschnitte zieht.

Strukturell ist die Bool Query selbst wieder eine Query, das heisst sie kann in jeder Stelle verwendet werden, an der Elasticsearch eine Query erwartet, inklusive verschachtelt in einer anderen Bool Query. Diese Kompositionsfaehigkeit macht die Bool Query zum universellen Werkzeug fuer komplexe Suchlogik, von einfachen Zwei-Klausel-Kombinationen bis zu tief verschachtelten Regelwerken mit dutzenden Bedingungen, wie sie in grossen E-Commerce-Suchen oder Log-Analyse-Systemen vorkommen.

2. must: Pflichtbedingungen im Scoring-Kontext

Die must-Klausel der Bool Query definiert Bedingungen, die zwingend erfuellt sein muessen, damit ein Dokument in den Treffern erscheint, und die gleichzeitig zum Relevanz-Score beitragen. Jede Query innerhalb von must laeuft im sogenannten Scoring-Kontext: Elasticsearch berechnet fuer jedes Dokument, wie gut es zur jeweiligen Bedingung passt, und summiert diese Teil-Scores zum Gesamt-Score des Dokuments. Eine match-Query in must traegt also nicht nur binaer "passt" oder "passt nicht" bei, sondern liefert einen abgestuften Relevanzwert.

Das macht must die richtige Wahl fuer alle Bedingungen, bei denen die Guete der Uebereinstimmung fuer die Sortierung der Ergebnisse relevant ist, typischerweise der eigentliche Suchtext des Nutzers. Wenn ein Kunde nach "wasserdichte laufschuhe" sucht, soll ein Produkt, dessen Titel exakt diese Woerter in dieser Reihenfolge enthaelt, hoeher ranken als ein Produkt, das die Begriffe nur verstreut in der Beschreibung hat. Genau das leistet die Bool Query mit einer match-Klausel in must.

Mehrere must-Klauseln in einer Bool Query verhalten sich logisch wie ein UND: alle muessen erfuellt sein. Anders als bei filter fliesst aber jede einzelne Klausel in die Score-Berechnung ein, was must rechnerisch teurer macht als eine reine Filterbedingung. Deshalb gehoert in die must-Klausel der Bool Query nur, was tatsaechlich Relevanz-relevant ist, nicht jede beliebige Einschraenkung.


GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "wasserdichte laufschuhe" } },
        { "match": { "description": "outdoor" } }
      ]
    }
  }
}
// Both clauses run in scoring context and both contribute
// to the final _score of every matching document

3. should: optionale Klauseln und Relevanz-Boost

Die should-Klausel der Bool Query beschreibt Bedingungen, die nicht erfuellt sein muessen, deren Erfuellung aber den Score eines Dokuments erhoeht. Steht eine Bool Query ausschliesslich aus should-Klauseln, muss standardmaessig mindestens eine davon zutreffen, damit ein Dokument in den Treffern landet. Sobald aber mindestens eine must- oder filter-Klausel vorhanden ist, werden alle should-Klauseln optional: sie beeinflussen nur noch den Score, nicht mehr, ob ein Dokument ueberhaupt matcht.

Dieses Verhalten macht should zum Werkzeug fuer weiches Boosting. Ein typisches Beispiel: die Pflichtsuche laeuft ueber must nach dem Produkttitel, waehrend zusaetzliche should-Klauseln Dokumente hoeher ranken, deren Marke, Kategorie oder Tags ebenfalls zum Suchbegriff passen. Ein Produkt, das sowohl den Titel-Match als auch einen Marken-Match erfuellt, bekommt einen hoeheren Score als eines, das nur den Titel trifft, ohne dass die Marken-Uebereinstimmung zur Pflichtbedingung wird.

Ein haeufiger Anwendungsfall der Bool Query ist die Kombination mehrerer should-Klauseln mit unterschiedlichem boost-Wert, um verschiedene Felder unterschiedlich stark zu gewichten. Eine Uebereinstimmung im Titel-Feld sollte in den meisten Suchanwendungen staerker zaehlen als eine Uebereinstimmung in einer langen Freitext-Beschreibung, und genau diese Gewichtung laesst sich ueber should-Klauseln mit individuellem Boost feinjustieren.


GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "laufschuhe" } }
      ],
      "should": [
        { "match": { "brand": { "query": "nike", "boost": 2.0 } } },
        { "match": { "tags": "bestseller" } }
      ]
    }
  }
}
// should clauses here are optional (a must clause exists)
// but still raise the score when they match

4. must_not: Ausschluss ohne Score-Beitrag

Die must_not-Klausel der Bool Query schliesst Dokumente aus, die eine bestimmte Bedingung erfuellen. Im Gegensatz zu must und should laeuft must_not immer im Filter-Kontext, nie im Scoring-Kontext. Das bedeutet: eine must_not-Klausel traegt niemals zum Score bei, sie entscheidet ausschliesslich binaer, ob ein Dokument in der Ergebnismenge bleibt oder herausfaellt. Diese Eigenschaft macht must_not rechnerisch guenstig und gut cachebar.

Typische Einsatzfelder fuer must_not in der Bool Query sind Ausschlusslisten: Produkte einer bestimmten Kategorie ausblenden, deaktivierte Datensaetze herausfiltern, oder in einer Logdaten-Suche bestimmte Statuscodes explizit ausschliessen. Wichtig zu verstehen ist, dass must_not keine Negation im klassischen booleschen Sinn mit Scoring-Auswirkung ist, sondern eine reine Mengenoperation: die Ergebnismenge wird um alle Dokumente reduziert, die der inneren Query entsprechen.

Ein haeufiger Denkfehler bei der Bool Query: Entwickler versuchen, mit mehreren must_not-Klauseln komplexe Ausschlusslogik abzubilden, obwohl eine einzelne terms-Query mit einer Liste von Werten performanter und lesbarer waere. Als Faustregel gilt: must_not eignet sich hervorragend fuer klare, binaere Ausschlusskriterien, wird aber unuebersichtlich, sobald mehr als drei oder vier Bedingungen kombiniert werden.


GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "laufschuhe" } }
      ],
      "must_not": [
        { "term": { "status": "discontinued" } },
        { "range": { "stock": { "lte": 0 } } }
      ]
    }
  }
}
// must_not always runs in filter context, no score contribution
// discontinued items and out-of-stock items are excluded outright

5. filter: der Filter-Kontext und sein Cache

Die filter-Klausel der Bool Query ist die wichtigste Klausel fuer Performance-Optimierung. Wie must_not laeuft auch filter ausschliesslich im Filter-Kontext: Elasticsearch prueft nur, ob ein Dokument die Bedingung erfuellt, berechnet aber keinen abgestuften Score dafuer. Das Ergebnis ist immer binaer, ja oder nein. Weil kein Scoring berechnet werden muss, sind Filter-Klauseln deutlich guenstiger als aequivalente must-Klauseln, besonders bei Range-Queries, Term-Queries auf Keyword-Feldern und exakten Uebereinstimmungen.

Der zweite grosse Vorteil von filter in der Bool Query ist das Caching. Elasticsearch cached haeufig verwendete Filter-Klauseln auf Segment-Ebene im sogenannten Filter-Cache, sodass wiederholte Anfragen mit derselben Filterbedingung, etwa {"term": {"category": "schuhe"}}, nicht jedes Mal neu ausgewertet werden muessen. Bei Suchanfragen mit stabilen, wiederkehrenden Filtern wie Kategorie, Preisbereich oder Verfuegbarkeit macht dieser Cache einen spuerbaren Performance-Unterschied, besonders bei hohem Suchvolumen.

Die Faustregel fuer die Bool Query lautet deshalb: alles, was zur Relevanz-Sortierung beitraegt, gehoert in must oder should, alles, was nur die Ergebnismenge einschraenkt, gehoert in filter. Ein Preisbereich, eine Kategorie-Zugehoerigkeit oder ein Lagerbestand groesser null sind klassische Kandidaten fuer filter, weil kein Nutzer erwartet, dass ein guenstigeres Produkt allein wegen seines Preises hoeher rankt als ein teureres.


GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "laufschuhe" } }
      ],
      "filter": [
        { "term": { "category.keyword": "running" } },
        { "range": { "price": { "gte": 50, "lte": 150 } } },
        { "range": { "stock": { "gt": 0 } } }
      ]
    }
  }
}
// filter clauses contribute zero score, only reduce the result set
// they are cacheable and much cheaper than equivalent must clauses

6. minimum_should_match praezise steuern

Der Parameter minimum_should_match steuert innerhalb der Bool Query, wie viele der vorhandenen should-Klauseln mindestens erfuellt sein muessen. Ohne eine must- oder filter-Klausel ist der implizite Standardwert 1, das heisst mindestens eine should-Klausel muss zutreffen. Dieser Standardwert laesst sich explizit ueberschreiben, entweder als feste Zahl, als Prozentsatz oder als Kombination aus beidem.

In der Praxis ist minimum_should_match besonders relevant, wenn eine Bool Query eine Liste von Synonymen oder alternativen Suchbegriffen als should-Klauseln abbildet. Mit "minimum_should_match": "75%" muessen drei von vier alternativen Begriffen zutreffen, was Praezision und Recall gegeneinander abwaegt: ein zu niedriger Wert bringt zu viele irrelevante Treffer, ein zu hoher Wert schliesst relevante Dokumente aus, die nur knapp nicht alle Kriterien erfuellen.

Ein haeufiger Anwendungsfall fuer minimum_should_match in der Bool Query ist die Multi-Term-Suche, bei der jeder Suchbegriff des Nutzers als eigene should-Klausel modelliert wird, statt eine einzelne match-Query mit dem gesamten Suchstring zu verwenden. Das erlaubt eine feinere Kontrolle darueber, wie tolerant die Suche gegenueber fehlenden Begriffen ist, als es die eingebaute minimum_should_match-Option einer einfachen match-Query bietet.


GET /products/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "tags": "wasserdicht" } },
        { "match": { "tags": "atmungsaktiv" } },
        { "match": { "tags": "leicht" } },
        { "match": { "tags": "gedaempft" } }
      ],
      "minimum_should_match": "75%"
    }
  }
}
// at least 3 of the 4 should clauses must match
// tunes precision against recall for synonym-style queries

7. Verschachtelte Bool Queries fuer komplexe Logik

Weil eine Bool Query selbst eine Query ist, laesst sie sich in jeder ihrer vier Klauseln erneut mit einer weiteren Bool Query verschachteln. Diese Kompositionsfaehigkeit ist der Schluessel, um logische Ausdruecke abzubilden, die ueber ein einfaches UND aller Klauseln hinausgehen, etwa "Kategorie A UND (Marke X ODER Marke Y)". Eine flache Bool Query kann diese Klammerung nicht ausdruecken, eine verschachtelte Bool Query hingegen schon.

In der Praxis entsteht diese Notwendigkeit haeufig bei Facettensuchen mit ODER-Verknuepfung innerhalb einer Facette und UND-Verknuepfung zwischen Facetten. Waehlt ein Nutzer in einem Shop mehrere Marken innerhalb der Marken-Facette aus, sollen Produkte gezeigt werden, die zu mindestens einer der gewaehlten Marken gehoeren, aber gleichzeitig weiterhin alle anderen aktiven Facetten-Filter erfuellen. Diese Logik wird durch eine aeussere Bool Query mit filter-Klauseln abgebildet, von denen eine selbst eine innere Bool Query mit should-Klauseln ist.

Bei tief verschachtelten Bool Queries lohnt es sich, auf Lesbarkeit zu achten: jede Verschachtelungsebene sollte eine klar benennbare logische Gruppe darstellen. Mehr als drei bis vier Ebenen Verschachtelung sind in der Regel ein Zeichen dafuer, dass die Suchlogik ueberdacht oder in mehrere separate Queries mit nachgelagerter Kombination der Ergebnisse aufgeteilt werden sollte.


GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "laufschuhe" } }
      ],
      "filter": [
        { "term": { "category.keyword": "running" } },
        {
          "bool": {
            "should": [
              { "term": { "brand.keyword": "nike" } },
              { "term": { "brand.keyword": "adidas" } }
            ],
            "minimum_should_match": 1
          }
        }
      ]
    }
  }
}
// outer bool: category AND (brand nike OR brand adidas)
// the nested bool query expresses the OR grouping cleanly

8. Scoring-Kontext vs. Filter-Kontext: Performance im Detail

Der Unterschied zwischen Scoring-Kontext und Filter-Kontext ist der wichtigste Performance-Hebel, den die Bool Query bietet. Im Scoring-Kontext, also fuer must und should, berechnet Elasticsearch fuer jedes potenzielle Treffer-Dokument einen Relevanzwert nach dem BM25-Algorithmus. Diese Berechnung kostet Rechenzeit pro Dokument und Klausel. Im Filter-Kontext, also fuer filter und must_not, entfaellt diese Berechnung vollstaendig, was Filter-Klauseln bei gleicher Datenmenge spuerbar schneller macht als aequivalente Scoring-Klauseln.

Zusaetzlich zum Wegfall der Score-Berechnung profitieren Filter-Klauseln der Bool Query vom bereits erwaehnten Filter-Cache, der haeufig wiederholte Bitset-Ergebnisse pro Segment vorhaelt. Eine Kombination aus einer must-Klausel fuer den eigentlichen Volltextsuchbegriff und mehreren filter-Klauseln fuer Kategorie, Preis und Verfuegbarkeit ist deshalb nicht nur semantisch korrekt, sondern auch die performanteste Struktur fuer eine typische E-Commerce-Suche.

Ein Benchmark-Beispiel aus der Praxis: eine Bool Query mit fuenf Filterbedingungen, von denen drei faelschlicherweise als must statt als filter modelliert wurden, kann bei grossen Indizes mit mehreren Millionen Dokumenten spuerbar langsamer sein als dieselbe Query mit korrekt zugeordneten Klauseln, weil Elasticsearch fuer jede der drei unnoetigen Scoring-Klauseln zusaetzliche Rechenarbeit leisten muss, ohne dass diese Arbeit fuer die Sortierung der Ergebnisse jemals genutzt wird.

9. Typische Fehler bei der Bool Query

Der haeufigste Fehler bei der Bool Query ist, Filterbedingungen versehentlich in must statt in filter zu packen. Das Ergebnis ist zwar inhaltlich korrekt, aber unnoetig langsam, weil Elasticsearch fuer jede dieser Klauseln einen Score berechnet, der am Ende gar nicht benoetigt wird. Der zweite haeufige Fehler ist die Annahme, dass should-Klauseln ohne explizites minimum_should_match automatisch optional bleiben, auch wenn keine must- oder filter-Klausel vorhanden ist. In diesem Fall greift der implizite Mindestwert von 1, was zu unerwartet leeren Ergebnismengen fuehren kann.

Klausel Kontext Traegt zum Score bei Typischer Einsatz
must Scoring Ja Pflicht-Suchbegriff mit Relevanz
should Scoring Ja Optionaler Boost, weiche Praeferenzen
filter Filter Nein Kategorie, Preis, Verfuegbarkeit
must_not Filter Nein Ausschlusslisten, deaktivierte Datensaetze

Ein dritter Fehler betrifft die Verschachtelung: wird eine should-Klausel innerhalb einer inneren Bool Query verwendet, ohne dass dort ein passendes minimum_should_match gesetzt ist, verhaelt sich diese innere Bool Query wieder nach den Standardregeln, was bei komplexen verschachtelten Strukturen schnell zu unerwarteten Ergebnissen fuehrt. Ein sorgfaeltiger Blick auf jede Verschachtelungsebene der Bool Query verhindert diese Klasse von Fehlern zuverlaessig.

Mironsoft

Elasticsearch- und OpenSearch-Suchloesungen fuer anspruchsvolle Datenmengen

Suchanfragen, die schnell und praezise gleichzeitig sind?

Wir analysieren bestehende Bool Queries, trennen Scoring-Kontext von Filter-Kontext und optimieren eure Suchlogik fuer Relevanz und Performance zugleich.

Query-Audit

Bestehende Bool Queries auf falsch platzierte Filter- und Scoring-Klauseln pruefen

Relevanz-Tuning

should-Klauseln, Boosts und minimum_should_match auf euer Sortiment abstimmen

Performance-Review

Filter-Cache-Nutzung pruefen und verschachtelte Bool Queries entschlacken

10. Zusammenfassung

Die Bool Query ist das zentrale Werkzeug der Elasticsearch Query DSL, um Suchlogik ueber vier klar getrennte Klauseln abzubilden. must und should laufen im Scoring-Kontext und beeinflussen die Relevanz-Sortierung, filter und must_not laufen im Filter-Kontext und entscheiden nur binaer ueber Zugehoerigkeit zur Ergebnismenge. Diese Trennung ist keine akademische Feinheit, sondern hat direkte Auswirkungen auf Ergebnisqualitaet und Antwortzeit einer Suche.

Wer bei jeder neuen Bedingung einer Bool Query bewusst entscheidet, ob sie zur Relevanz beitragen soll oder nur einschraenken soll, vermeidet die haeufigsten Performance-Fallen. minimum_should_match steuert feingranular, wie streng optionale Klauseln ausgewertet werden, und verschachtelte Bool Queries erlauben, komplexe Und-Oder-Kombinationen abzubilden, die eine flache Query nicht ausdruecken kann. Die Bool Query bleibt damit auch bei wachsender Anforderungskomplexitaet das richtige Werkzeug, solange die Verschachtelungstiefe im Blick bleibt.

Bool Query im Detail, das Wichtigste auf einen Blick

must und should

Laufen im Scoring-Kontext und tragen zum Relevanz-Score bei. Fuer alles nutzen, was die Sortierung beeinflussen soll.

filter und must_not

Laufen im Filter-Kontext, kein Score, aber cachebar und schneller. Fuer reine Ein- und Ausschlusskriterien nutzen.

minimum_should_match

Steuert, wie viele should-Klauseln erfuellt sein muessen. Standardwert 1, sobald keine must- oder filter-Klausel existiert.

Verschachtelung

Eine Bool Query ist selbst eine Query und kann in jeder Klausel erneut verschachtelt werden, fuer komplexe Und-Oder-Logik.

11. FAQ: Bool Query im Detail

1Was ist eine Bool Query in Elasticsearch?
Eine Bool Query kombiniert mehrere Bedingungen ueber must, should, must_not und filter, jede mit eigenem Scoring-Verhalten.
2Unterschied zwischen must und filter?
must traegt zum Score bei, filter berechnet keinen Score, ist dafuer cachebar und guenstiger.
3Wann werden should-Klauseln optional?
Sobald must oder filter vorhanden ist. Ohne beides muss mindestens eine should-Klausel zutreffen.
4Was macht minimum_should_match?
Legt fest, wie viele should-Klauseln mindestens erfuellt sein muessen, als Zahl oder Prozentsatz.
5Warum ist filter schneller als must?
Kein Score-Berechnung, dazu Filter-Cache auf Segment-Ebene fuer wiederholte Anfragen.
6Kann eine Bool Query verschachtelt werden?
Ja, beliebig tief in jeder Klausel, fuer komplexe Und-Oder-Kombinationen.
7Was traegt must_not zum Score bei?
Nichts, must_not laeuft immer im Filter-Kontext und schliesst rein binaer aus.
8Wie viele Klauseln maximal?
Kein hartes Limit, aber ab drei bis vier Verschachtelungsebenen leidet die Lesbarkeit.
9Funktioniert das identisch in OpenSearch?
Ja, Syntax und Scoring-Verhalten sind zwischen Elasticsearch und OpenSearch identisch.
10Wie debugge ich fehlende Treffer?
Explain-API und Validate-Query nutzen, oft liegt es am impliziten minimum_should_match von 1.