Diferença de Elasticsearch entre DEVE e DEVE consulta bool


168

Qual é a diferença entre MUSTe SHOULDconsulta bool no ES?

Se eu só quero resultados que contenham meus termos, devo usar must?

Eu tenho uma consulta que deve conter apenas determinados valores e também nenhum resultado com data / carimbo de data / hora menor do que a data / hora de hoje - AGORA

Além disso

Posso usar vários filtros dentro de um must como o código abaixo:

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

Respostas:


249

must significa: A cláusula (consulta) deve aparecer em documentos correspondentes. Essas cláusulas devem corresponder, como AND lógico .

deveria significa: Pelo menos uma dessas cláusulas deve corresponder, como OR lógico .

Basicamente, eles são usados ​​como operadores lógicos AND e OR. Veja isso .

Agora em uma consulta booleana :

must significa: Cláusulas que devem corresponder para que o documento seja incluído.

deveria significa: Se essas cláusulas coincidem, elas aumentam o _score; caso contrário, eles não terão efeito. Eles são simplesmente usados ​​para refinar a pontuação de relevância para cada documento.


Sim, você pode usar vários filtros dentro must.


Um pouco atrasado para a festa, mas e quanto musta categorias ou preços e shouldatributos, como tamanho e cor. Agora, se os tamanhos L e XL estiverem selecionados, é obrigatório entre esses dois, mas se a cor verde também estiver selecionada, deve ser obrigatória para (tamanhos L ou XL) E (cor verde). Isso é possível?
— Mave

Acredito que, nesse caso, os filtros possam ser uma abordagem melhor para atributos. Eles são voltados para correspondências exatas e não para pesquisas baseadas em relevância. Consulte consultas e filtros nos documentos para obter mais informações.
— Jim K.

6
Eu acho que você precisa ter minimum_number_should_match = 1para reforçar a ideia de que "pelo menos uma dessas cláusulas deve corresponder".
— Jim K.

Boa resposta! Eu só quero compartilhar uma parte da documentação que foi muito útil para eu entender isso. elastic.co/guide/en/elasticsearch/guide/current/…
— ba0708

1
JimK - ou não deve cláusula. Quando não existe uma cláusula obrigatória, o número_mínimo_de_modelo deve ser implícito.
— LizH

15

Como essa é uma pergunta popular, gostaria de acrescentar que na versão 2 do Elasticsearch as coisas mudaram um pouco.

Em vez de filteredconsulta, deve-se usar a boolconsulta no nível superior.

Se você não se importa com a pontuação das mustpartes, coloque-as na filterchave. Nenhuma pontuação significa pesquisa mais rápida. Além disso, o Elasticsearch descobrirá automaticamente se os cache, etc., must_noté igualmente válido para o cache.

Referência: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

Além disso, lembre-se de que "gte": "now"não pode ser armazenado em cache, devido à granularidade de milissegundos. Use dois intervalos em uma mustcláusula: um com now/1he outro com nowpara que o primeiro possa ser armazenado em cache por um tempo e o segundo para uma filtragem precisa acelerada em um conjunto de resultados menor.


8

Como dito na documentação :

Deve: A cláusula (consulta) deve aparecer nos documentos correspondentes.

Deveria: A cláusula (consulta) deve aparecer no documento correspondente. Em uma consulta booleana sem cláusulas de obrigação, uma ou mais cláusulas de obrigação devem corresponder a um documento. O número mínimo de cláusulas should a serem correspondidas pode ser definido usando o parâmetro minimum_should_match.

Em outras palavras, os resultados deverão ser correspondidos por todas as consultas presentes na cláusula must (ou corresponder a pelo menos uma das cláusulas should se não houver cláusula must .

Como você deseja que seus resultados atendam a todas as consultas, você deve usar must .


Você pode realmente usar filtros dentro de uma consulta booleana.


10
Eu acho que você quer dizer "você deve usar must" em vez de "você deve usar must" ;-)
— jarmod
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.