Elasticsearch – Query DSL
En Elasticsearch, la búsqueda se realiza mediante el uso de consultas basadas en JSON. Una consulta se compone de dos cláusulas –
-
Cláusulas de consulta de hoja – Estas cláusulas son de coincidencia, término o rango, que buscan un valor específico en un campo específico.
-
Cláusulas de consulta compuesta – Estas consultas son una combinación de cláusulas de consulta de hoja y otras consultas compuestas para extraer la información deseada.
Elasticsearch soporta un gran número de consultas. Una consulta comienza con una palabra clave de consulta y luego tiene condiciones y filtros dentro en forma de objeto JSON. A continuación se han descrito los diferentes tipos de consultas.
Consulta Match All
Esta es la consulta más básica; devuelve todo el contenido y con la puntuación de 1,0 para cada objeto.
POST /schools/_search{ "query":{ "match_all":{} }}
Al ejecutar el código anterior, obtenemos el siguiente resultado –
{ "took" : 7, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : , "fees" : 2200, "tags" : , "rating" : "3.3" } }, { "_index" : "schools", "_type" : "school", "_id" : "4", "_score" : 1.0, "_source" : { "name" : "City Best School", "description" : "ICSE", "street" : "West End", "city" : "Meerut", "state" : "UP", "zip" : "250002", "location" : , "fees" : 3500, "tags" : , "rating" : "4.5" } } ] }}
Consultas de texto completo
Estas consultas se utilizan para buscar un cuerpo de texto completo como un capítulo o un artículo de noticias. Esta consulta funciona según el analizador asociado a ese índice o documento en particular. En esta sección hablaremos de los diferentes tipos de consultas de texto completo.
Consulta de coincidencia
Esta consulta hace coincidir un texto o frase con los valores de uno o varios campos.
POST /schools*/_search{ "query":{ "match" : { "rating":"4.5" } }}
Al ejecutar el código anterior, obtenemos la respuesta que se muestra a continuación –
{ "took" : 44, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.47000363, "hits" : , "fees" : 3500, "tags" : , "rating" : "4.5" } } ] }}
Consulta Multi Match
Esta consulta coincide con un texto o frase con más de un campo.
POST /schools*/_search{ "query":{ "multi_match" : { "query": "paprola", "fields": } }}
Al ejecutar el código anterior, obtenemos la respuesta que se muestra a continuación –
{ "took" : 12, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.9808292, "hits" : , "fees" : 2200, "tags" : , "rating" : "3.3" } } ] }}
Consulta de cadena de consulta
Esta consulta utiliza el analizador de consultas y la palabra clave query_string.
POST /schools*/_search{ "query":{ "query_string":{ "query":"beautiful" } }}
Al ejecutar el código anterior, obtenemos la respuesta que se muestra a continuación –
{ "took" : 60, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" },………………………………….
Consultas de nivel de término
Estas consultas tratan principalmente con datos estructurados como números, fechas y enums.
POST /schools*/_search{ "query":{ "term":{"zip":"176115"} }}
Al ejecutar el código anterior, obtenemos la respuesta que se muestra a continuación –
……………………………..hits" : , } }] …………………………………………..
Consulta de rango
Esta consulta se utiliza para encontrar los objetos que tienen valores entre los rangos de valores dados. Para ello, necesitamos utilizar operadores como –
- gte – mayor que igual a
- gt – mayor que
- lte – menor que igual a
- lt – menor que
Por ejemplo, observe el código dado a continuación –
POST /schools*/_search{ "query":{ "range":{ "rating":{ "gte":3.5 } } }}
Al ejecutar el código anterior, obtenemos la respuesta como se muestra a continuación –
{ "took" : 24, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.0, "hits" : , "fees" : 3500, "tags" : , "rating" : "4.5" } } ] }}
Existen otros tipos de consultas a nivel de término también como –
-
Consulta de existencia – Si un determinado campo tiene valor no nulo.
-
Consulta de ausencia – Esto es completamente opuesto a la consulta de existencia, esta consulta busca objetos sin campos específicos o campos que tienen valor nulo.
-
Consulta de comodines o regexp – Esta consulta utiliza expresiones regulares para encontrar patrones en los objetos.
Consultas compuestas
Estas consultas son una colección de diferentes consultas fusionadas entre sí mediante el uso de booleanoperadores como and, or, not or para diferentes índices o teniendo llamadas a funciones, etc.
POST /schools/_search{ "query": { "bool" : { "must" : { "term" : { "state" : "UP" } }, "filter": { "term" : { "fees" : "2200" } }, "minimum_should_match" : 1, "boost" : 1.0 } }}
Al ejecutar el código anterior, obtenemos la respuesta que se muestra a continuación –
{ "took" : 6, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : }}
Consultas geográficas
Estas consultas tratan sobre ubicaciones y puntos geográficos. Estas consultas ayudan a encontrar escuelas o cualquier otro objeto geográfico cerca de cualquier ubicación. Es necesario utilizar el tipo de datos geo point.
PUT /geo_example{ "mappings": { "properties": { "location": { "type": "geo_shape" } } }}
Al ejecutar el código anterior, obtenemos la respuesta como se muestra a continuación –
{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "geo_example"}
Ahora publicamos los datos en el índice creado anteriormente.
POST /geo_example/_doc?refresh{ "name": "Chapter One, London, UK", "location": { "type": "point", "coordinates": }}
Al ejecutar el código anterior, obtenemos la respuesta que se muestra a continuación –