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?
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?
Risposte:
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.
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
Supponiamo che l'indice myindex
contenga 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
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
hello sam
(usando la parola chiave filter
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
Documenti che contengono hello
o sam
vengono restituiti. I documenti NON sono classificati .
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
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.
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.
Filters
-> Questo documento corrisponde? un binario sì o no risposta
Queries
-> Questo documento corrisponde? Quanto bene corrisponde? usa il punteggio
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.