Differenza di ricerca elastica tra DEVE e DOVREBBE query bool


169

Qual è la differenza tra MUSTe SHOULDbool query in ES?

Se desidero SOLO risultati che contengono i miei termini, devo utilizzare must?

Ho una query che dovrebbe contenere solo determinati valori e anche nessun risultato che abbia una data / data / ora inferiore rispetto alla data / ora di oggi - ORA

Anche

Posso usare più filtri all'interno di un must come il codice seguente:

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

Risposte:


252

must significa: la clausola (query) deve apparire nei documenti corrispondenti. Queste clausole devono corrispondere, come AND logico .

dovrebbe significare: almeno una di queste clausole deve corrispondere, come OR logico .

Fondamentalmente sono usati come operatori logici AND e OR. Vedere questo .

Ora in una query bool :

must significa: clausole che devono corrispondere per includere il documento.

dovrebbe significare: se queste clausole corrispondono, aumentano il _score; in caso contrario, non hanno alcun effetto. Vengono semplicemente utilizzati per perfezionare il punteggio di pertinenza per ciascun documento.


Sì, puoi usare più filtri all'interno must.


Un po 'in ritardo per la festa, ma che ne dici mustdi categorie o prezzi e shoulddi attributi, come dimensioni e colore. Ora, se vengono selezionate le dimensioni L e XL, è un must tra quelle due, ma se viene selezionato anche il colore verde, deve essere un must per (taglie L OR XL) E (colore verde). È possibile?
Mave,

Credo che in tal caso i filtri potrebbero essere un approccio migliore per gli attributi. Sono orientati verso corrispondenze esatte e non ricerche basate sulla pertinenza. Consulta le query e i filtri nei documenti per ulteriori informazioni.
Jim K.

6
Penso che devi avere minimum_number_should_match = 1per far valere l'idea che "almeno una di queste clausole deve corrispondere".
Jim K.

Buona risposta! Voglio solo condividere una parte della documentazione che mi è stata molto utile per capirlo. elastic.co/guide/en/elasticsearch/guide/current/…
ba0708

1
JimK - o no clausola obbligatoria. Quando non è presente alcuna clausola must, è implicito il minimo_numero_should_match.
LizH,

15

Poiché questa è una domanda popolare, vorrei aggiungere che nella versione 2 di Elasticsearch le cose sono cambiate un po '.

Invece della filteredquery, si dovrebbe usare la boolquery al livello superiore.

Se non ti interessa il punteggio delle mustparti, allora mettile in filterchiave. Nessun punteggio significa ricerca più veloce. Inoltre, Elasticsearch capirà automaticamente se memorizzarli nella cache, ecc. must_notÈ ugualmente valido per la memorizzazione nella cache.

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

Inoltre, tieni presente che "gte": "now"non può essere memorizzato nella cache, a causa della granularità di millisecondi. Utilizzare due intervalli in una mustclausola: uno con now/1he l'altro con in nowmodo che il primo possa essere memorizzato nella cache per un po 'e il secondo per un filtraggio preciso accelerato su un set di risultati più piccolo.


8

Come detto nella documentazione :

Must: la clausola (query) deve apparire nei documenti corrispondenti.

Dovrebbe: la clausola (query) dovrebbe apparire nel documento corrispondente. In una query booleana senza clausole must, una o più clausole should devono corrispondere a un documento. Il numero minimo di clausole should da abbinare può essere impostato usando il parametro minimum_should_match.

In altre parole, i risultati dovranno essere accompagnato da tutte le query presenti nel mosto clausola (o corrispondere almeno uno dei dovrebbe clausole se non v'è alcun obbligo clausola.

Poiché desideri che i risultati soddisfino tutte le query, devi utilizzare must .


Puoi infatti utilizzare i filtri all'interno di una query booleana.


10
Penso che intendi "devi usare must" piuttosto che "dovresti usare must" ;-)
jarmod
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.