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.
Inhaltsverzeichnis
- 1. Was die Bool Query wirklich leistet
- 2. must: Pflichtbedingungen im Scoring-Kontext
- 3. should: optionale Klauseln und Relevanz-Boost
- 4. must_not: Ausschluss ohne Score-Beitrag
- 5. filter: der Filter-Kontext und sein Cache
- 6. minimum_should_match praezise steuern
- 7. Verschachtelte Bool Queries fuer komplexe Logik
- 8. Scoring-Kontext vs. Filter-Kontext: Performance
- 9. Typische Fehler bei der Bool Query
- 10. Zusammenfassung
- 11. FAQ
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.