it-swarm.com.de

Elasticsearch Unterschied zwischen MUST und SHOULD Bool Query

Was ist der Unterschied zwischen MUST und SHOULD bool query in ES?

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

Ich habe eine Abfrage, die nur bestimmte Werte enthalten sollte, und auch keine Ergebnisse, die ein niedrigeres Datum/einen niedrigeren Zeitstempel als die heutige Zeit/das heutige Datum haben - JETZT

auch

Kann ich mehrere Filter in einem Muss wie den folgenden verwenden:

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

muss bedeuten: Die Klausel (Abfrage) muss in übereinstimmenden Dokumenten vorkommen. Diese Klauseln müssen wie logisch [~ # ~] und [~ # ~] übereinstimmen.

sollte bedeuten: Mindestens eine dieser Klauseln muss übereinstimmen, wie logisch [~ # ~] oder [~ # ~] .

Grundsätzlich werden sie wie logische Operatoren AND und OR verwendet. Siehe this .

Jetzt in einer Bool-Abfrage :

muss bedeutet: Klauseln, die müssen für das Dokument, das aufgenommen werden soll, übereinstimmen.

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


Ja, Sie können mehrere Filter in must verwenden.

177
Utsav Dawn

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

Anstelle von filtered query sollte in der obersten Ebene bool query verwendet werden.

Wenn Sie sich nicht für die Bewertung von must Teilen interessieren, legen Sie diese Teile in den filter Schlüssel. Keine Wertung bedeutet schnellere Suche. Außerdem findet Elasticsearch automatisch heraus, ob sie zwischengespeichert werden sollen usw. must_not 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" kann wegen der Millisekunden-Granularität nicht zwischengespeichert werden. Verwenden Sie zwei Bereiche in einer must -Klausel: einen mit now/1h und ein anderes mit now, sodass das erste für eine Weile zwischengespeichert werden kann und das zweite für präzises Filtern für eine kleinere Ergebnismenge beschleunigt wird.

12

Wie gesagt in der Dokumentation :

Must: Die Klausel (Abfrage) muss in übereinstimmenden Dokumenten enthalten sein.

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

Mit anderen Worten, Ergebnisse müssen mit allen in der must -Klausel (oder match Mindestens eine der soll - Klausel, wenn es keine muss - Klausel gibt.

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


Sie können in der Tat Filter in einer booleschen Abfrage verwenden.

3
Heschoon