Actualmente estoy tratando de migrar una aplicación basada en solr a elasticsearch.
Tengo esta consulta lucene
((
name:(+foo +bar)
OR info:(+foo +bar)
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)
Por lo que entiendo, esta es una combinación de cláusulas DEBE combinadas con OR booleano:
"Obtenga todos los documentos que contengan (foo AND bar en el nombre) OR (foo AND bar en la información). Después de eso, el filtro resulta por estado de condición = 1 y aumenta los documentos que tienen una imagen".
He estado tratando de usar una consulta bool con DEBE, pero no puedo obtener OR booleana en cláusulas must. Esto es lo que tengo:
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 puede ver, faltan condiciones para "información".
¿Alguien tiene una solución?
Muchas gracias.
** ACTUALIZACIÓN **
He actualizado mi consulta de Elasticsearch y me he deshecho de esa puntuación de función. Mi problema base todavía existe.
fuente
Respuestas:
Ejemplo:
Desea ver todos los elementos que son (redondos Y (rojo O azul)):
También puede hacer versiones más complejas de OR, por ejemplo, si desea hacer coincidir al menos 3 de 5, puede especificar 5 opciones en "debería" y establecer un "mínimo_deberinto" de 3.
Gracias a Glen Thompson y Sebastialonso por encontrar dónde mi anidación no estaba del todo bien antes.
Gracias también a Fatmajk por señalar que "término" se convierte en "coincidencia" en ElasticSearch 6.
fuente
should
al nivel superiorbool
e incluir unaminimum_should_match: 1
obra?[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]
. ¿De alguna manera esto depende de la versión?minimum_should
es 1, y envolviendo esobool
resulta en que ese grupo sea verdadero si al menos un elemento coincide, falso si ninguno coincide. Mi motivación para crear esta respuesta fue que estaba resolviendo exactamente este tipo de problema, y la documentación disponible e incluso las respuestas que pude encontrar en sitios como este fueron inútiles en el mejor de los casos, así que seguí investigando hasta que sentí que tenía una comprensión bastante sólida. de lo que estaba pasando. Agradezco cualquier sugerencia constructiva sobre cómo puedo mejorar aún más la respuesta.Finalmente logré crear una consulta que hace exactamente lo que quería tener:
Una consulta booleana anidada filtrada. No estoy seguro de por qué esto no está documentado. Tal vez alguien aquí puede decirme?
Aquí está la consulta:
En pseudo-SQL:
Tenga en cuenta que depende del análisis de campo de su documento y las asignaciones de cómo se maneja internamente name = foo. Esto puede variar de un comportamiento difuso a estricto.
"minimum_should_match": 1 dice que al menos una de las declaraciones debe ser verdadera.
Estas declaraciones significan que cada vez que hay un documento en el conjunto de resultados que contiene has_image: 1 se ve reforzado por el factor 100. Esto cambia el orden de los resultados.
Que se diviertan chicos :)
fuente
Así es como puede anidar múltiples consultas bool en una consulta bool externa usando Kibana,
Así es como puede anidar una consulta en ES
Hay más tipos en "bool" como -
Filtrar
no debe
fuente
Recientemente tuve que resolver este problema también, y después de MUCHA prueba y error se me ocurrió esto (en PHP, pero se asigna directamente al DSL):
Lo que se asigna a algo como esto en SQL:
La clave de todo esto es la
minimum_should_match
configuración. Sin esto, elfilter
totalmente anula elshould
.¡Espero que esto ayude a alguien!
fuente
En
must
lo que necesita para agregar la matriz condición de consulta que desea trabajar conAND
y enshould
lo que necesita para agregar la condición de consulta que desea trabajar conOR
.Puede verificar esto: https://github.com/Smile-SA/elasticsuite/issues/972
fuente
Si estaba usando el analizador de consultas predeterminado de Solr o Lucene, casi siempre puede ponerlo en una consulta de cadena de consulta:
Dicho esto, es posible que desee utilizar un consulta booleana , como la que ya publicó, o incluso una combinación de las dos.
fuente