Diferença de Elasticsearch entre DEVE e DEVE consulta bool

168

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

Se eu 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"
                }
            }
        },
user2722667
fonte

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.

Utsav Dawn
fonte
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.

TautrimasPajarskas
fonte
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.

Heschoon
fonte
10
Eu acho que você quer dizer "você deve usar must" em vez de "você deve usar must" ;-)
jarmod