Atualmente, estou tentando migrar um aplicativo baseado em solr para elasticsearch.
Eu tenho essa consulta lucene
((
name:(+foo +bar)
OR info:(+foo +bar)
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)
Tanto quanto eu entendo isso é uma combinação de cláusulas MUST combinadas com OR booleano:
"Obtenha todos os documentos que contêm (foo AND bar no nome) OR (foo AND bar no info). Depois desse filtro, resulta pelo estado de condição = 1 e aprimora os documentos que têm uma imagem."
Eu tenho tentado usar uma consulta bool com MUST, mas não consigo obter OR booleano em cláusulas must. Aqui está o que eu tenho:
GET /test/object/_search
{
"from": 0,
"size": 20,
"sort": {
"_score": "desc"
},
"query": {
"bool": {
"must": [
{
"match": {
"name": "foo"
}
},
{
"match": {
"name": "bar"
}
}
],
"must_not": [],
"should": [
{
"match": {
"has_image": {
"query": 1,
"boost": 100
}
}
}
]
}
}
}
Como você pode ver, as condições DEVE para "informações" estão ausentes.
Alguém tem uma solução?
Muito obrigado.
** ATUALIZAÇÃO **
Atualizei minha consulta elasticsearch e me livrei dessa pontuação de função. Meu problema básico ainda existe.
fonte
Respostas:
Exemplo:
Você deseja ver todos os itens que são (redondo E (vermelho OU azul)):
Você também pode executar versões mais complexas do OR, por exemplo, se desejar corresponder a pelo menos 3 de 5, você pode especificar 5 opções em "should" e definir um "minimum_should" de 3.
Agradeço a Glen Thompson e Sebastialonso por descobrirem onde meu ninho não estava bem antes.
Agradecemos também a Fatmajk por apontar que "termo" se torna "correspondência" no ElasticSearch 6.
fonte
should
para o nível superiorbool
e incluir umminimum_should_match: 1
trabalho?[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]
. De alguma forma, isso depende da versão?minimum_should
é 1, e obool
agrupamento resulta em que esse grupo seja verdadeiro se pelo menos um item corresponder, falso se nenhum corresponder. Minha motivação para criar essa resposta foi que eu estava resolvendo exatamente esse tipo de problema, e a documentação disponível e até mesmo as respostas que eu encontrava em sites como esse não eram úteis na melhor das hipóteses, então continuei pesquisando até sentir que tinha uma compreensão bastante sólida do que estava acontecendo. Congratulo-me com quaisquer sugestões construtivas sobre como melhorar ainda mais a resposta.Finalmente consegui criar uma consulta que faz exatamente o que eu queria:
Uma consulta booleana aninhada filtrada. Não sei por que isso não está documentado. Talvez alguém aqui possa me dizer?
Aqui está a consulta:
Em pseudo-SQL:
Lembre-se de que depende da análise do campo do documento e dos mapeamentos de como name = foo é tratado internamente. Isso pode variar de um comportamento difuso a estrito.
"minimum_should_match": 1 diz que pelo menos uma das instruções should deve ser verdadeira.
Esta declaração significa que sempre que houver um documento no conjunto de resultados que contenha has_image: 1, ele será impulsionado pelo fator 100. Isso altera a ordem dos resultados.
Divirtam-se rapazes :)
fonte
É assim que você pode aninhar várias consultas bool em uma consulta externa usando o Kibana,
É assim que você pode aninhar uma consulta no ES
Existem mais tipos em "bool", como -
Filtro
Não deve
fonte
Recentemente, eu tive que resolver esse problema também e, após várias tentativas e erros, vim com isso (em PHP, mas mapeia diretamente para o DSL):
Que mapeia para algo assim no SQL:
A chave em tudo isso é a
minimum_should_match
configuração. Sem isso,filter
substitui totalmente oshould
.Espero que isso ajude alguém!
fonte
Em
must
você precisa adicionar a matriz de condições de consulta com a qual deseja trabalharAND
e emshould
você precisa adicionar a condição de consulta com a qual deseja trabalharOR
.Você pode verificar isso: https://github.com/Smile-SA/elasticsuite/issues/972
fonte
Se você estava usando o analisador de consulta padrão ou Lucene do Solr, pode sempre colocá-lo em uma consulta de string de consulta:
Dito isto, convém usar uma consulta booleana , como a que você já postou, ou até mesmo uma combinação das duas.
fonte