Query vs. filtri


198

Non riesco a vedere alcuna descrizione di quando dovrei usare una query o un filtro o una combinazione dei due. Qual'è la differenza tra loro? Qualcuno può spiegare?


46
In realtà la documentazione ufficiale non è molto chiara
geekazoid

2
Sembra che sia apparsa una pagina con una spiegazione più avanzata: elastic.co/guide/en/elasticsearch/guide/master/…
Dmitry Polushkin,

6
Vale la pena notare che query e filtri verranno uniti in ES 2.0, quindi la maggior parte di ciò che è stato detto e scritto per query vs filtri non sarà più applicabile. Controlla anche il post sul blog ufficiale che annuncia questa modifica.
Val

Risposte:


201

La differenza è semplice: i filtri sono memorizzati nella cache e non influenzano il punteggio, quindi più velocemente delle query. Dai un'occhiata anche qui . Diciamo che una query è in genere qualcosa che gli utenti digitano e praticamente imprevedibile, mentre i filtri aiutano gli utenti a restringere i risultati della ricerca, ad esempio utilizzando le sfaccettature.


19
Bene, quindi, se l'utente sta eseguendo una ricerca di tipo Google, utilizzerei una query? Se stanno selezionando il valore possibile da un menu a discesa (ad esempio, conteggio fattura> 50), questo sarebbe un filtro?
Jonesie

4
Sì, è esattamente vero. Ogni volta che è necessario limitare l'intera serie di documenti con una certa metrica, di solito è un caso che un filtro sia appropriato. Quindi forse per età, lunghezza, dimensioni, ecc. Ecc.
Zach

La mia soluzione utilizza filtri e query nella stessa richiesta ed è super veloce sul database di test. Presto avremo i dati in tempo reale per vedere quanto è veloce.
Jonesie

@Zach Per essere assolutamente chiari, in un sistema multi-tenant, con autorizzazioni per gli utenti all'interno di un tenant, sembra che le informazioni sul tenant / autenticazione sarebbero un filtro aggiunto ad ogni query (cioè una query filtrata). Destra?
Scott Willeke,

4
@activescott Sì, è quello che vorrei fare. Puoi anche impostare alias filtrati in modo che gli "alias utente" applichino sempre il filtro appropriato. Semplifica l'amministrazione e non richiede modifiche al codice per aggiornare le query, ulteriori cruft nella query, ecc.
Zach

99

Questo è ciò che dice la documentazione ufficiale:

Come regola generale, è necessario utilizzare i filtri anziché le query:

  • per ricerche binarie sì / no
  • per query su valori esatti

Come regola generale, le query dovrebbero essere utilizzate al posto dei filtri:

  • per la ricerca di testo completo
  • dove il risultato dipende da un punteggio di pertinenza

quando voglio cancellare un documento, dovrei usare un filtro se possibile? Non voglio che sia memorizzato nella cache
Rytek,

quando si elimina un documento, non è necessario alcun punteggio, né è necessario eseguire una ricerca di testo completo. Quindi questo sarebbe un filtro di, dato che devi solo prendere una decisione di eliminazione / non eliminazione. filter-query-context
nonNumericalFloat

13

Un esempio (provalo tu stesso)

Supponiamo che l'indice myindexcontenga tre documenti:

curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hi Stack Overflow!" }'

Query: quanto un documento corrisponde alla query

Query hello sam(usando la parola chiave must)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'

Al documento "Hello world! I am Sam."viene assegnato un punteggio più alto di "Hello world!", poiché il primo corrisponde a entrambe le parole nella query. I documenti vengono assegnati.

"hits" : [
   ...
     "_score" : 0.74487394,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...
     "_score" : 0.22108285,
     "_source" : {
       "name" : "Hello world!"
     }
   ...

Filtro: indica se un documento corrisponde alla query

Filtro hello sam(usando la parola chiave filter)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'

Documenti che contengono helloo samvengono restituiti. I documenti NON sono classificati .

"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...

A meno che non sia necessaria la ricerca full-text o il punteggio, i filtri sono preferiti perché i filtri utilizzati di frequente verranno memorizzati automaticamente nella cache da Elasticsearch, per accelerare le prestazioni. Vedi Elasticsearch: contesto di query e filtri.


11

Qualche altra aggiunta allo stesso. Prima viene applicato un filtro, quindi la query viene elaborata sui risultati. Per memorizzare la corrispondenza binaria vero / falso per documento, viene utilizzato qualcosa chiamato array bitSet. Questo array di BitSet è in memoria e verrà utilizzato dalla seconda volta in cui viene interrogato il filtro. In questo modo, utilizzando la struttura dati dell'array bitset, siamo in grado di utilizzare il risultato memorizzato nella cache.

Un altro punto da notare qui, la cache del filtro viene creata solo quando viene eseguita la richiesta, quindi solo dal secondo hit, otteniamo effettivamente il vantaggio della memorizzazione nella cache.

Ma poi puoi usare un'API più calda , per superare questo. Quando registri una query con filtro su un'API più calda, si assicurerà che questa venga eseguita su un nuovo segmento ogni volta che diventa attiva. Quindi otterremo una velocità costante dalla prima esecuzione stessa.


1
Interessante! Non mi ero reso conto che i filtri accadessero prima delle query. La memorizzazione nella cache dei filtri ha più senso ora.
Constant Meiring,

Non sempre. La differenza di base e primaria tra query di punteggio filtrata e costante. Il punteggio costante esegue sempre prima la query e quindi applica il filtro su di essa. Anche le query filtrate hanno impostazioni in base alle quali la query può essere eseguita prima dei filtri.
piyush Goyal

10

Fondamentalmente, una query viene utilizzata quando si desidera eseguire una ricerca sui documenti con punteggio. E i filtri vengono utilizzati per restringere l'insieme dei risultati ottenuti utilizzando la query. I filtri sono booleani.

Ad esempio, supponiamo che tu abbia un indice di ristoranti qualcosa come zomato. Ora vuoi cercare ristoranti che servono "pizza" , che è fondamentalmente la tua parola chiave di ricerca.

Quindi utilizzerai la query per trovare tutti i documenti contenenti "pizza" e otterrete alcuni risultati.

Di 'ora che vuoi un elenco di ristoranti che servono pizza e hanno una valutazione di almeno 4.0.

Quindi quello che dovrai fare è usare la parola chiave "pizza" nella tua query e applicare il filtro per la valutazione come 4.0.

Quello che succede è che i filtri vengono generalmente applicati ai risultati ottenuti interrogando il tuo indice.


Non puoi fornire un esempio di un corpo di richiesta?
Cane

9

Filters-> Questo documento corrisponde? un binario sì o no risposta

Queries-> Questo documento corrisponde? Quanto bene corrisponde? usa il punteggio


0

Dalla versione 2 di Elasticsearch, i filtri e le query sono stati uniti e qualsiasi clausola di query può essere utilizzata come filtro o query (a seconda del contesto). Come per la versione 1, i filtri vengono memorizzati nella cache e devono essere utilizzati se il punteggio non ha importanza.

Fonte: https://logz.io/blog/elasticsearch-queries/

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.