Consultas vs. Filtros


198

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?


46
Documentação oficial não é muito clara, de fato
geekazoid

2
Parece que há apareceu uma página com a explicação mais avançado: elastic.co/guide/en/elasticsearch/guide/master/...
Dmitry Polushkin

6
É importante notar que as consultas e os filtros serão mesclados no ES 2.0, portanto, a maior parte do que foi dito e escrito para consultas versus filtros não será mais aplicada. Verifique também a postagem oficial do blog que anuncia essa alteração.
Val

Respostas:


201

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.


19
Certo, se o usuário estiver fazendo uma pesquisa do tipo google, eu usaria uma consulta? Se eles estiverem selecionando o valor possível em uma lista suspensa (por exemplo, contagem de faturas> 50), isso seria um filtro?
Jonesie

4
Sim, isso é exatamente correto. Sempre que você precisar restringir todo o conjunto de documentos por alguma métrica, geralmente é o caso de um filtro apropriado. Então, talvez pela idade, comprimento, tamanho, etc etc
Zach

Minha solução usa filtros e consultas na mesma solicitação e é super rápida no banco de dados de teste. Em breve, obteremos os dados ao vivo para ver o quão rápido é realmente.
Jonesie

@Zach Para ser absolutamente claro, em um sistema com vários locatários - com permissões para usuários dentro de um locatário -, parece que as informações de inquilino / autenticação seriam um filtro adicionado a todas as consultas (por exemplo, uma consulta filtrada). Certo?
21813 Scott Willeke

4
@activescott Sim, é isso que eu faria. Você também pode configurar aliases filtrados para que "aliases de usuário" sempre apliquem o filtro apropriado. Torna a administração mais fácil e não requer alterações no código para consultas de atualização, cruft extra em sua consulta, etc.
Zach

99

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

quando quiser excluir um documento, devo usar um filtro, se possível? Eu não quero que ele seja armazenado em cache #
217 Rytek

ao excluir um documento, você não precisa de nenhuma pontuação, nem precisa fazer uma pesquisa de texto completo. Portanto, esse seria um filtro, pois você só precisa tomar uma decisão de exclusão / não exclusão. filter-query-context
nonNumericalFloat 29/01

13

Um exemplo (tente você mesmo)

O índice do Say myindexconté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

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

Filtro 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 helloou samsã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."
     }
   ...

A menos que você precise de pesquisa ou pontuação de texto completo, os filtros são preferidos porque os filtros usados ​​com frequência serão armazenados em cache automaticamente pelo Elasticsearch, para acelerar o desempenho. Consulte Elasticsearch: contexto de consulta e filtro.


11

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.


1
Interessante! Não percebi que os filtros aconteciam antes das consultas. O cache de filtros faz mais sentido agora.
Constant Meiring

Nem sempre. A diferença básica e primária entre a consulta de pontuação filtrada e a constante. A pontuação constante sempre executa a consulta primeiro e depois aplica o filtro sobre ela. Até a consulta filtrada possui configurações pelas quais a consulta pode ser executada antes dos filtros.
usar o seguinte código

10

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.


Você não pode fornecer um exemplo de um corpo de solicitação?
Dog

9

Filters-> Este documento corresponde? um binário sim ou não resposta

Queries-> Este documento corresponde? Quão bem ele combina? usa pontuação


0

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.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.