Qual é a diferença entre MUST
e SHOULD
consulta 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"
}
}
},
fonte
must
a categorias ou preços eshould
atributos, 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?minimum_number_should_match = 1
para reforçar a ideia de que "pelo menos uma dessas cláusulas deve corresponder".Como essa é uma pergunta popular, gostaria de acrescentar que na versão 2 do Elasticsearch as coisas mudaram um pouco.
Em vez de
filtered
consulta, deve-se usar abool
consulta no nível superior.Se você não se importa com a pontuação das
must
partes, coloque-as nafilter
chave. 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 umamust
cláusula: um comnow/1h
e outro comnow
para 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.fonte
Como dito na documentação :
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.
fonte