Elasticsearch Unterschied zwischen MUST und SOLLTE Bool-Abfrage


168

Was ist der Unterschied zwischen MUSTund SHOULDbool query in ES?

Wenn ich NUR Ergebnisse möchte, die meine Begriffe enthalten, sollte ich sie dann verwenden must?

Ich habe eine Abfrage, die nur bestimmte Werte enthalten sollte, und auch keine Ergebnisse, deren Datum / Zeitstempel niedriger ist als die heutige Zeit / Datum - JETZT

Ebenfalls

Kann ich mehrere Filter in einem Muss wie dem folgenden Code verwenden:

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },

Antworten:


247

must bedeutet: Die Klausel (Abfrage) muss in übereinstimmenden Dokumenten erscheinen. Diese Klauseln müssen wie das logische UND übereinstimmen .

sollte bedeuten: Mindestens eine dieser Klauseln muss übereinstimmen, wie logisches ODER .

Grundsätzlich werden sie wie logische Operatoren AND und OR verwendet. Sehen Sie das .

Jetzt in einer Bool-Abfrage :

must bedeutet: Klauseln, die übereinstimmen müssen , damit das Dokument aufgenommen wird.

sollte bedeuten: Wenn diese Klauseln übereinstimmen, erhöhen sie die _score; Andernfalls haben sie keine Wirkung. Sie werden einfach verwendet, um die Relevanzbewertung für jedes Dokument zu verfeinern.


Ja, Sie können mehrere Filter verwenden must.


Ein bisschen spät zur Party, aber wie wäre es mit mustKategorien oder Preisen und shouldAttributen wie Größe und Farbe? Wenn nun Größe L und XL ausgewählt sind, ist es ein Muss zwischen diesen beiden, aber wenn auch Farbe Grün ausgewählt ist, muss es ein Muss für (Größen L ODER XL) UND (Farbe Grün) sein. Ist das möglich?
Mave

Ich glaube, in diesem Fall könnten Filter ein besserer Ansatz für Attribute sein. Sie sind auf exakte Übereinstimmungen und nicht auf relevanzbasierte Suchen ausgerichtet. Siehe Abfragen und Filter in der Dokumentation für weitere Informationen.
Jim K.

6
Ich denke, Sie müssen haben minimum_number_should_match = 1, um die Idee durchzusetzen, dass "mindestens eine dieser Klauseln übereinstimmen muss".
Jim K.

Gute Antwort! Ich möchte nur einen Teil der Dokumentation teilen, der für mich sehr hilfreich war, um dies zu verstehen. elastic.co/guide/en/elasticsearch/guide/current/…
ba0708

1
JimK - oder keine Must-Klausel. Wenn es keine must-Klausel gibt, wird die Minimum_Number_should_match impliziert.
LizH

15

Da dies eine beliebte Frage ist, möchte ich hinzufügen, dass sich in Elasticsearch Version 2 die Dinge etwas geändert haben.

Anstelle einer filteredAbfrage sollte eine boolAbfrage in der obersten Ebene verwendet werden.

Wenn Sie sich nicht für die Partitur interessieren must, geben Sie diese Teile in den filterSchlüssel ein. Keine Wertung bedeutet schnellere Suche. Außerdem findet Elasticsearch automatisch heraus, ob sie zwischengespeichert werden sollen usw. must_notDies gilt auch für das Caching.

Referenz: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

Beachten Sie auch, dass "gte": "now"dies aufgrund der Millisekunden-Granularität nicht zwischengespeichert werden kann. Verwenden Sie zwei Bereiche in einer mustKlausel: einen mit now/1hund einen mit, nowdamit der erste für eine Weile zwischengespeichert werden kann und der zweite für eine präzise Filterung, die auf eine kleinere Ergebnismenge beschleunigt wird.


8

Wie in der Dokumentation gesagt :

Muss: Die Klausel (Abfrage) muss in übereinstimmenden Dokumenten erscheinen.

Sollte: Die Klausel (Abfrage) sollte im passenden Dokument erscheinen. In einer booleschen Abfrage ohne must-Klauseln müssen eine oder mehrere if-Klauseln mit einem Dokument übereinstimmen. Die Mindestanzahl der übereinstimmenden Sollte-Klauseln kann mit dem Parameter Minimum_should_match festgelegt werden.

Mit anderen Worten, die Ergebnisse müssen mit allen in der must- Klausel enthaltenen Abfragen übereinstimmen (oder mit mindestens einer der should- Klauseln übereinstimmen , wenn es keine must- Klausel gibt.

Da Sie möchten, dass Ihre Ergebnisse alle Abfragen erfüllen, sollten Sie must verwenden .


Sie können tatsächlich Filter in einer booleschen Abfrage verwenden.


10
Ich denke du meinst "du musst must verwenden" anstatt "du solltest must verwenden" ;-)
jarmod
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.