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?
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?
Respuestas:
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.
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
Say index myindex
contiene 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
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
hello sam
(usando la palabra clave filter
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
Documentos que contienen hello
o sam
son devueltos. Los documentos NO se califican .
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
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í.
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.
Filters
-> ¿Coincide este documento? un binario sí o no respuesta
Queries
-> ¿Coincide este documento? ¿Qué tan bien combina? usa puntuación
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.