tutorial - elasticsearch vs mongodb




Consultas vs. Filtros (4)

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


Un ejemplo (pruébalo tú mismo)

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 !" }'

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" }}}}
}'

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 son calificados.

"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 (utilizando el filter palabras clave)

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

Se devuelven los documentos que contienen hello o sam . Los documentos NO son calificados .

"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 de texto completo o una calificación, se prefieren los filtros porque Elasticsearch almacena en caché los filtros de uso frecuente para acelerar el rendimiento. Ver Elasticsearch: consulta y contexto del filtro.


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

Por ejemplo, diga 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 contengan "pizza" y se obtendrán algunos resultados.

Diga ahora que desea una lista del restaurante que sirve 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.


La diferencia es simple: los filtros están en la memoria caché y no influyen en el puntaje, por lo tanto, son más rápidos que las consultas. Echa un vistazo here también. Digamos que una consulta generalmente es algo que los usuarios escriben y es bastante impredecible, mientras que los filtros ayudan a los usuarios a limitar los resultados de búsqueda, por ejemplo, mediante el uso de facetas.


Pocos más además de lo mismo. Primero se aplica un filtro y luego la consulta se procesa sobre sus resultados. Para almacenar la coincidencia binario verdadero / falso por documento, se utiliza algo llamado matriz de conjuntos de bits. Esta matriz BitSet está en la memoria y esto se usaría desde la segunda vez que se consulta el filtro. De esta forma, utilizando la estructura de datos array array bitset, podemos utilizar el resultado almacenado en caché.

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

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







elasticsearch