Elastisch zoeken verschil tussen MUST en SHOLD bool query

Wat is het verschil tussen musten mustbool-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 filteredzoekopdracht, moet je een boolzoekopdracht 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_notis 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/1hen een andere met nowzodat 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.

Other episodes