Elasticsearch diferencia entre DEBE y DEBE consulta bool

168

¿Cuál es la diferencia entre MUSTy SHOULDbool query en ES?

Si SOLO quiero resultados que contengan mis términos, ¿debería usarlos must?

Tengo una consulta que solo debe contener ciertos valores, y tampoco resultados que tengan una fecha / marca de fecha más baja que la fecha / hora de hoy - AHORA

también

¿Puedo usar varios filtros dentro de un must como el código siguiente:

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

Respuestas:

249

must significa: la cláusula (consulta) debe aparecer en los documentos coincidentes. Estas cláusulas deben coincidir, como lógico AND .

debería significar: Al menos una de estas cláusulas debe coincidir, como OR lógico .

Básicamente se usan como operadores lógicos AND y OR. Mira esto .

Ahora en una consulta bool :

must significa: Cláusulas que deben coincidir para que se incluya el documento.

debería significar: si estas cláusulas coinciden, aumentan la _score; de lo contrario, no tienen efecto. Simplemente se utilizan para refinar la puntuación de relevancia para cada documento.


Sí, puedes usar múltiples filtros dentro must.

Amanecer Utsav
fuente
Un poco tarde para la fiesta, pero ¿qué hay mustde las categorías, los precios y los shouldatributos, como el tamaño y el color? Ahora, si se seleccionan el tamaño L y XL, es un deber entre esos dos, pero si también se selecciona el color verde, debe ser imprescindible para (tamaños L o XL) Y (color verde). ¿Es eso posible?
Mave
Creo que en ese caso los filtros podrían ser un mejor enfoque para los atributos. Están orientados a coincidencias exactas y no a búsquedas basadas en relevancia. Consulte las consultas y los filtros en los documentos para obtener más información.
Jim K.
66
Creo que debe tener minimum_number_should_match = 1para hacer cumplir la idea de que "al menos una de estas cláusulas debe coincidir".
Jim K.
¡Buena respuesta! Solo quiero compartir una parte de la documentación que me fue muy útil para comprender esto. elastic.co/guide/en/elasticsearch/guide/current/...
ba0708
1
JimK - o no debe cláusula obligatoria. Cuando no hay una cláusula must, se implica el valor mínimo_número_de_coincidencia.
LizH
15

Como esta es una pregunta popular, me gustaría agregar que en Elasticsearch versión 2 las cosas cambiaron un poco.

En lugar de filteredconsulta, uno debe usar la boolconsulta en el nivel superior.

Si no te importa la puntuación de las mustpartes, pon esas partes en filterclave. Sin puntuación significa búsqueda más rápida. Además, Elasticsearch determinará automáticamente si almacenarlos en caché, etc., must_notes igualmente válido para el almacenamiento en caché.

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

Además, "gte": "now"tenga en cuenta que no se puede almacenar en caché, debido a la granularidad de milisegundos. Use dos rangos en una mustcláusula: uno con now/1hy otro con nowpara que el primero se pueda almacenar en caché por un tiempo y el segundo para un filtrado preciso acelerado en un conjunto de resultados más pequeño.

TautrimasPajarskas
fuente
8

Como se dice en la documentación :

Debe: la cláusula (consulta) debe aparecer en los documentos coincidentes.

Debería: La cláusula (consulta) debería aparecer en el documento correspondiente. En una consulta booleana sin cláusulas must, una o más cláusulas must deben coincidir con un documento. El número mínimo de cláusulas debería coincidir se puede establecer utilizando el parámetro minimum_should_match.

En otras palabras, los resultados tendrán que ser igualada por todas las consultas presente en el mosto de la cláusula (o coincida con al menos una de las deberían cláusulas si no hay necesidad cláusula.

Como desea que sus resultados satisfagan todas las consultas, debe usar must .


De hecho, puede usar filtros dentro de una consulta booleana.

Heschoon
fuente
10
Creo que significa "debe utilizar imprescindible" en lugar de "se debe utilizar debe" ;-)
jarmod