Não consigo ver nenhuma descrição de quando devo usar uma consulta ou um filtro ou alguma combinação dos dois. Qual a diferença entre eles? Alguém pode explicar?
Não consigo ver nenhuma descrição de quando devo usar uma consulta ou um filtro ou alguma combinação dos dois. Qual a diferença entre eles? Alguém pode explicar?
Respostas:
A diferença é simples: os filtros são armazenados em cache e não influenciam a pontuação, portanto, mais rapidamente que as consultas. Dê uma olhada aqui também. Digamos que uma consulta geralmente seja algo que os usuários digitam e praticamente imprevisível, enquanto os filtros ajudam os usuários a restringir os resultados da pesquisa, por exemplo, usando facetas.
Isto é o que a documentação oficial diz:
Como regra geral, os filtros devem ser usados em vez de consultas:
- para pesquisas binárias sim / não
- para consultas sobre valores exatos
Como regra geral, as consultas devem ser usadas em vez dos filtros:
- para pesquisa de texto completo
- onde o resultado depende de uma pontuação de relevância
O índice do Say myindex
contém três documentos:
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!" }'
Consulta: quão bem um documento corresponde à consulta
hello sam
(usando a palavra-chave must
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'
O documento "Hello world! I am Sam."
recebe uma pontuação mais alta que "Hello world!"
, porque o primeiro corresponde às duas palavras da consulta. Os documentos são pontuados.
"hits" : [
...
"_score" : 0.74487394,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
"_score" : 0.22108285,
"_source" : {
"name" : "Hello world!"
}
...
Filtro: se um documento corresponde à consulta
hello sam
(usando palavra-chave filter
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
Documentos que contêm um hello
ou sam
são retornados. Os documentos NÃO são pontuados .
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
Mais alguns acréscimos ao mesmo. Um filtro é aplicado primeiro e, em seguida, a consulta é processada sobre seus resultados. Para armazenar a correspondência binária verdadeiro / falso por documento, é usado algo chamado matriz bitSet. Essa matriz BitSet está na memória e seria usada na segunda vez em que o filtro fosse consultado. Dessa maneira, usando a estrutura de dados da matriz de bits, podemos utilizar o resultado em cache.
Mais um ponto a ser observado aqui, o cache do filtro é criado apenas quando a solicitação é executada; portanto, apenas a partir do segundo hit, obtemos a vantagem do cache.
Mas então você pode usar uma API mais quente para superar isso. Quando você registra uma consulta com filtro em uma API mais quente, ela garante que ela seja executada em um novo segmento sempre que for publicada. Portanto, obteremos velocidade consistente a partir da primeira execução.
Basicamente, uma consulta é usada quando você deseja executar uma pesquisa em seus documentos com pontuação. E os filtros são usados para restringir o conjunto de resultados obtidos usando a consulta. Os filtros são booleanos.
Por exemplo, digamos que você tenha um índice de restaurantes como o zomato. Agora você deseja procurar restaurantes que servem 'pizza' , que é basicamente a sua palavra-chave de pesquisa.
Então você usará a consulta para encontrar todos os documentos que contêm "pizza" e alguns resultados serão obtidos.
Diga agora que você quer uma lista de restaurantes que servem pizza e tem uma classificação de pelo menos 4,0.
Portanto, o que você precisará fazer é usar a palavra-chave "pizza" na sua consulta e aplicar o filtro para classificação como 4,0.
O que acontece é que os filtros geralmente são aplicados nos resultados obtidos consultando seu índice.
Filters
-> Este documento corresponde? um binário sim ou não resposta
Queries
-> Este documento corresponde? Quão bem ele combina? usa pontuação
Desde a versão 2 do Elasticsearch, os filtros e as consultas foram mesclados e qualquer cláusula de consulta pode ser usada como filtro ou como consulta (dependendo do contexto). Como na versão 1, os filtros são armazenados em cache e devem ser usados se a pontuação não importa.