Wat is het verschil tussen must
en must
bool-query’s in ES?
Als ik ALLEENresultaten wil die mijn voorwaarden bevatten, moet ik dan must
?
gebruiken
Ik heb een zoekopdracht die alleen bepaalde waarden mag bevatten, en ook geen resultaten met een lagere datum/tijdstempel dan de tijd/datum van vandaag – NU
Ook
Kan ik meerdere filters gebruiken in een must zoals de onderstaande code:
"filtered": {
"filter": {
"bool" : {
"must" : {
"term" : { "type" : 1 }
"term" : { "totals" : 14 }
"term" : { "groupId" : 3 }
"range" : {
"expires" : {
"gte": "now"
}
}
},
Antwoord 1, autoriteit 100%
moetbetekent: de clausule (query) moet voorkomen in overeenkomende documenten. Deze clausules moeten overeenkomen, zoals logische AND.
zoubetekent: ten minste één van deze clausules moet overeenkomen, zoals logische OF.
In principe worden ze gebruikt als logische operatoren AND en OR. Zie dit.
Nu in een bool-query:
moetenbetekent: clausules die moetenovereenkomen om het document op te nemen.
moetenbetekent: als deze clausules overeenkomen, verhogen ze de _score
; anders hebben ze geen effect. Ze worden eenvoudigweg gebruikt om de relevantiescore voor elk document te verfijnen.
Ja, je kunt meerdere filters gebruiken binnen must
.
Antwoord 2, autoriteit 6%
Aangezien dit een populaire vraag is, wil ik hieraan toevoegen dat er in Elasticsearch versie 2 dingen een beetje zijn veranderd.
In plaats van een filtered
zoekopdracht, moet je een bool
zoekopdracht op het hoogste niveau gebruiken.
Als je niet geïnteresseerd bent in de partituur van must
-partijen, zet die delen dan in de filter
-toets. Geen scoren betekent sneller zoeken. Elasticsearch zal ook automatisch uitzoeken of ze in de cache moeten worden opgeslagen, enz. must_not
is even geldig voor caching.
Referentie: https://www.elastic.co /guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
Houd er ook rekening mee dat "gte": "now"
niet in de cache kan worden opgeslagen vanwege de milliseconde granulariteit. Gebruik twee bereiken in een must
-clausule: een met now/1h
en een andere met now
zodat de eerste een tijdje in de cache kan worden opgeslagen en de tweede voor nauwkeurige filtering versneld op een kleinere resultatenset.
Antwoord 3, autoriteit 4%
Zoals gezegd in de documentatie:
Moet: de clausule (query) moet voorkomen in overeenkomende documenten.
Moet: de clausule (query) moet in het overeenkomende document verschijnen. In een booleaanse zoekopdracht zonder must-clausules, moeten een of meer moeten-clausules overeenkomen met een document. Het minimum aantal moeten clausules dat moet overeenkomen, kan worden ingesteld met behulp van de parameter minimum_should_match.
Met andere woorden, de resultaten moeten overeenkomen met allezoekopdrachten in de must-clausule (of minstens éénvan de should-clausules als er geen must-clausule is.
Omdat je wilt dat je resultaten aan alle zoekopdrachten voldoen, moet je mustgebruiken.
Je kunt inderdaad filters gebruiken in een booleaanse zoekopdracht.