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"
}
}
},
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.
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.
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.