Consultas vs. Filtros


198

No puedo ver ninguna descripción de cuándo debería usar una consulta o un filtro o alguna combinación de ambos. ¿Cuál es la diferencia entre ellos? ¿Alguien puede explicar?


46
De hecho, la documentación oficial no es muy clara
geekazoid el

2
Parece que apareció una página con una explicación más avanzada: elastic.co/guide/en/elasticsearch/guide/master/…
Dmitry Polushkin

66
Vale la pena señalar que las consultas y los filtros se fusionarán en ES 2.0, por lo tanto, la mayor parte de lo que se ha dicho y escrito para consultas vs filtros ya no se aplicará. Consulte también la publicación oficial del blog que anuncia este cambio.
Val

Respuestas:


201

La diferencia es simple: los filtros se almacenan en caché y no influyen en la puntuación, por lo tanto, son más rápidos que las consultas. Echa un vistazo aquí también. Digamos que una consulta suele ser algo que los usuarios escriben y es bastante impredecible, mientras que los filtros ayudan a los usuarios a reducir los resultados de búsqueda, por ejemplo, utilizando facetas.


19
Bien, si el usuario está haciendo una búsqueda de tipo google, ¿usaría una consulta? Si seleccionan un posible valor de un menú desplegable (por ejemplo, recuento de facturas> 50), ¿este sería un filtro?
Jonesie

44
Sí, eso es exactamente correcto. Cada vez que necesite restringir todo el conjunto de documentos por alguna métrica, generalmente es un caso en el que un filtro es apropiado. Tal vez por edad, longitud, tamaño, etc., etc.
Zach

Mi solución usa filtros y consultas en la misma solicitud y es superrápida en la base de datos de prueba. Pronto obtendremos los datos en vivo allí para ver qué tan rápido es realmente.
Jonesie

@Zach Para ser absolutamente claro, en un sistema multiinquilino -con permisos para los usuarios dentro de un inquilino-, parece que la información del inquilino / autenticación sería un filtro agregado a cada consulta (es decir, una consulta filtrada). ¿Correcto?
Scott Willeke

44
@activescott Sí, eso es lo que haría. También puede configurar alias filtrados para que los "alias de usuario" siempre apliquen el filtro apropiado. Hace que la administración sea más fácil y no requiere cambios de código para actualizar las consultas, información adicional en su consulta, etc.
Zach

99

Esto es lo que dice la documentación oficial:

Como regla general, se deben usar filtros en lugar de consultas:

  • para búsquedas binarias sí / no
  • para consultas sobre valores exactos

Como regla general, se deben usar consultas en lugar de filtros:

  • para la búsqueda de texto completo
  • donde el resultado depende de una puntuación de relevancia

cuando quiero eliminar un documento, ¿debería usar un filtro si es posible? No quiero que se
almacene en

al eliminar un documento, no necesita ningún puntaje ni necesita realizar una búsqueda de texto completo. Entonces, este sería un filtro que, ya que solo necesita tomar una decisión de eliminación / no eliminación. filter-query-context
nonNumericalFloat

13

Un ejemplo (pruébalo tú mismo)

Say index myindexcontiene tres documentos:

curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hi Stack Overflow!" }'

Consulta: qué tan bien coincide un documento con la consulta

Consulta hello sam(usando la palabra clave must)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'

Al documento "Hello world! I am Sam."se le asigna una puntuación más alta que "Hello world!", porque el primero coincide con ambas palabras en la consulta. Los documentos se puntúan.

"hits" : [
   ...
     "_score" : 0.74487394,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...
     "_score" : 0.22108285,
     "_source" : {
       "name" : "Hello world!"
     }
   ...

Filtro: si un documento coincide con la consulta

Filtrar hello sam(usando la palabra clave filter)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'

Documentos que contienen helloo samson devueltos. Los documentos NO se califican .

"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...

A menos que necesite una búsqueda o puntuación de texto completo, se prefieren los filtros porque Elasticsearch almacenará en caché los filtros de uso frecuente para acelerar el rendimiento. Consulte Elasticsearch: consulta y filtro de contexto.


11

Pocas adiciones más a lo mismo. Primero se aplica un filtro y luego la consulta se procesa sobre sus resultados. Para almacenar la coincidencia binaria verdadero / falso por documento, se usa algo llamado bitSet Array. Esta matriz BitSet está en la memoria y se usaría desde la segunda vez que se consulta el filtro. De esta manera, utilizando la estructura de datos de la matriz de bitset, podemos utilizar el resultado almacenado en caché.

Un punto más a tener en cuenta aquí, la caché de filtro se crea solo cuando la solicitud se ejecuta, por lo tanto, solo desde el segundo golpe, en realidad obtenemos la ventaja del almacenamiento en caché.

Pero luego puede usar una API más cálida para superar esto. Cuando registra una consulta con filtro en una API más cálida, se asegurará de que se ejecute en un nuevo segmento cada vez que se active. Por lo tanto, obtendremos una velocidad constante desde la primera ejecución en sí.


1
¡Interesante! No me di cuenta de que los filtros suceden antes de las consultas. El almacenamiento en caché de los filtros tiene más sentido ahora.
Meiring constante

No siempre. La diferencia básica y primaria entre consulta de puntuación filtrada y constante. La puntuación constante siempre ejecuta la consulta primero y luego aplica el filtro sobre ella. Incluso la consulta filtrada tiene configuraciones por las cuales la consulta puede ejecutarse antes de los filtros.
piyushGoyal

10

Básicamente, una consulta se utiliza cuando desea realizar una búsqueda en sus documentos con puntuación. Y los filtros se utilizan para limitar el conjunto de resultados obtenidos mediante el uso de la consulta. Los filtros son booleanos.

Por ejemplo, digamos que tiene un índice de restaurantes algo así como zomato. Ahora desea buscar restaurantes que sirvan 'pizza' , que es básicamente su palabra clave de búsqueda.

Por lo tanto, utilizará la consulta para encontrar todos los documentos que contienen "pizza" y se obtendrán algunos resultados.

Digamos ahora que desea una lista de restaurantes que sirven pizza y tiene una calificación de al menos 4.0.

Entonces, lo que tendrá que hacer es usar la palabra clave "pizza" en su consulta y aplicar el filtro para calificar como 4.0.

Lo que sucede es que los filtros generalmente se aplican a los resultados obtenidos al consultar su índice.


¿No puede proporcionar un ejemplo de un cuerpo de solicitud?
Perro

9

Filters-> ¿Coincide este documento? un binario sí o no respuesta

Queries-> ¿Coincide este documento? ¿Qué tan bien combina? usa puntuación


0

Desde la versión 2 de Elasticsearch, los filtros y las consultas se han fusionado y cualquier cláusula de consulta se puede usar como filtro o consulta (según el contexto). Al igual que con la versión 1, los filtros se almacenan en caché y deben usarse si la puntuación no importa.

Fuente: https://logz.io/blog/elasticsearch-queries/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.