2015-02-27 12 views
72

Qual è la differenza tra MUST e SHOULD query bool in ES?Differenza Elasticsearch tra MUST e DOVREBBE query bool

Se I SOLO desidera i risultati che contengono i miei termini, devo quindi utilizzare must?

Ho una domanda che dovrebbe contenere solo determinati valori, e, inoltre, non che ha una minore data/timestamp di tempo di oggi/data - ORA

anche

È possibile utilizzare filtri multipli all'interno un deve avere il codice qui sotto:

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

risposta

95

deve significa: La clausola (query) deve apparire nei documenti corrispondenti. Queste clausole devono corrispondere, come logica E.

dovrebbe mezzi: Almeno una di queste clausole devono corrispondere, come logica O.

Fondamentalmente sono utilizzati come operatori logici AND e OR. Vedi this.

Ora in una bool query:

must significa: Clausole che devono corrispondere per il documento da inserire.

dovrebbe significa: Se queste clausole corrispondono, aumentano il punteggio; altrimenti, non hanno alcun effetto. Sono semplicemente usati per affinare il punteggio di pertinenza per ogni documento.


Sì, è possibile utilizzare più filtri all'interno del mosto.

+0

Un po 'in ritardo per la festa, ma che ne dite di 'must' per categorie, o pricing, e' should' per attributi , come dimensione e colore. Ora, se sono selezionate le dimensioni L e XL, è un valore tra questi due, ma se è selezionato anche il colore verde, deve essere un must per (dimensioni L o XL) E (colore verde). È possibile? – Mave

+0

Credo che in questo caso _filters_ potrebbe essere un approccio migliore per gli attributi. Sono orientati verso corrispondenze esatte e non ricerche basate sulla rilevanza. Vedi [query e filtri] (http://www.elastic.co/guide/en/elasticsearch/guide/master/_queries_and_filters.html) nella documentazione per maggiori informazioni. –

+2

Penso che sia necessario avere "minimum_number_should_match = 1' per far valere l'idea che" almeno una di queste clausole deve corrispondere ". –

3

Come detto nella documentation:

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

In caso affermativo: la clausola (query) deve essere visualizzata nel documento corrispondente. In una query booleana con clausole no must, una o più clausole devono corrispondere a un documento. È possibile impostare il numero minimo di clausole dovrebbe corrispondere utilizzando il parametro minimum_should_match.

In altre parole, i risultati dovranno essere affiancati da tutti le query presenti nel mosto clausola (o partita almeno uno dei dovrebbe clausole se non c'è must clausola.

Dal momento che si desidera che i risultati per soddisfare tutte le query, è necessario utilizzare must.


È possibile utilizzare i filtri all'interno di una query booleana.

+2

Penso che tu intenda "devi usare must" piuttosto che "devi usare must" ;-) – jarmod

9

Poiché questa è una domanda popolare, vorrei aggiungere che in Elasticsearch versione 2 le cose sono leggermente cambiate.

Invece della query filtered, è necessario utilizzare la query bool nel livello superiore.

Se non ti interessa il punteggio di must parti, quindi mettere quelle parti in chiave filter. Nessun punteggio significa ricerca più veloce. Inoltre, Elasticsearch calcolerà 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, presente che "gte": "now" non può essere memorizzata nella cache, a causa di millisecondo granularità. Utilizza due intervalli in una clausola must: uno con now/1h e un altro con now in modo che il primo possa essere memorizzato nella cache per un po 'e il secondo per il filtro preciso accelerato su un set di risultati più piccolo.

Problemi correlati