Elasticsearch - Consulta DSL
En Elasticsearch, la búsqueda se realiza mediante consultas basadas en JSON. Una consulta se compone de dos cláusulas:
Leaf Query Clauses - Estas cláusulas son coincidencia, término o rango, que buscan un valor específico en un campo específico.
Compound Query Clauses - Estas consultas son una combinación de cláusulas de consulta de hoja y otras consultas compuestas para extraer la información deseada.
Elasticsearch admite una gran cantidad 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 describen los diferentes tipos de consultas.
Coincidir con todas las consultas
Esta es la consulta más básica; devuelve todo el contenido y con una 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" : [
{
"_index" : "schools",
"_type" : "school",
"_id" : "5",
"_score" : 1.0,
"_source" : {
"name" : "Central School",
"description" : "CBSE Affiliation",
"street" : "Nagan",
"city" : "paprola",
"state" : "HP",
"zip" : "176115",
"location" : [
31.8955385,
76.8380405
],
"fees" : 2200,
"tags" : [
"Senior Secondary",
"beautiful campus"
],
"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" : [
28.9926174,
77.692485
],
"fees" : 3500,
"tags" : [
"fully computerized"
],
"rating" : "4.5"
}
}
]
}
}
Consultas de texto completo
Estas consultas se utilizan para buscar un texto completo, como un capítulo o un artículo de noticias. Esta consulta funciona de acuerdo con el analizador asociado con ese índice o documento en particular. En esta sección, discutiremos los diferentes tipos de consultas de texto completo.
Consulta de coincidencia
Esta consulta hace coincidir un texto o una frase con los valores de uno o más campos.
POST /schools*/_search
{
"query":{
"match" : {
"rating":"4.5"
}
}
}
Al ejecutar el código anterior, obtenemos la respuesta como 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" : [
{
"_index" : "schools",
"_type" : "school",
"_id" : "4",
"_score" : 0.47000363,
"_source" : {
"name" : "City Best School",
"description" : "ICSE",
"street" : "West End",
"city" : "Meerut",
"state" : "UP",
"zip" : "250002",
"location" : [
28.9926174,
77.692485
],
"fees" : 3500,
"tags" : [
"fully computerized"
],
"rating" : "4.5"
}
}
]
}
}
Consulta de coincidencia múltiple
Esta consulta hace coincidir un texto o una frase con más de un campo.
POST /schools*/_search
{
"query":{
"multi_match" : {
"query": "paprola",
"fields": [ "city", "state" ]
}
}
}
Al ejecutar el código anterior, obtenemos la respuesta como 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" : [
{
"_index" : "schools",
"_type" : "school",
"_id" : "5",
"_score" : 0.9808292,
"_source" : {
"name" : "Central School",
"description" : "CBSE Affiliation",
"street" : "Nagan",
"city" : "paprola",
"state" : "HP",
"zip" : "176115",
"location" : [
31.8955385,
76.8380405
],
"fees" : 2200,
"tags" : [
"Senior Secondary",
"beautiful campus"
],
"rating" : "3.3"
}
}
]
}
}
Consulta de cadena de consulta
Esta consulta utiliza un 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 como 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 enumeraciones.
POST /schools*/_search
{
"query":{
"term":{"zip":"176115"}
}
}
Al ejecutar el código anterior, obtenemos la respuesta como se muestra a continuación:
……………………………..
hits" : [
{
"_index" : "schools",
"_type" : "school",
"_id" : "5",
"_score" : 0.9808292,
"_source" : {
"name" : "Central School",
"description" : "CBSE Affiliation",
"street" : "Nagan",
"city" : "paprola",
"state" : "HP",
"zip" : "176115",
"location" : [
31.8955385,
76.8380405
],
}
}
]
…………………………………………..
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 - menos que
Por ejemplo, observe el código que se proporciona 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" : [
{
"_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" : [
28.9926174,
77.692485
],
"fees" : 3500,
"tags" : [
"fully computerized"
],
"rating" : "4.5"
}
}
]
}
}
También existen otros tipos de consultas de nivel de término como:
Exists query - Si un determinado campo tiene un valor no nulo.
Missing query - Esto es completamente opuesto a la consulta existente, esta consulta busca objetos sin campos específicos o campos que tengan valor nulo.
Wildcard or regexp query - Esta consulta usa expresiones regulares para encontrar patrones en los objetos.
Consultas compuestas
Estas consultas son una colección de consultas diferentes fusionadas entre sí mediante el uso de operadores booleanos como y, o, no o para diferentes índices o con 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 como 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 con ubicaciones geográficas y puntos geográficos. Estas consultas ayudan a encontrar escuelas o cualquier otro objeto geográfico cercano a cualquier ubicación. Debe utilizar el tipo de datos de punto geográfico.
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": [11.660544, 57.800286]
}
}
Al ejecutar el código anterior, obtenemos la respuesta como se muestra a continuación:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
"_index" : "geo_example",
"_type" : "_doc",
"_id" : "hASWZ2oBbkdGzVfiXHKD",
"_score" : 1.0,
"_source" : {
"name" : "Chapter One, London, UK",
"location" : {
"type" : "point",
"coordinates" : [
11.660544,
57.800286
]
}
}
}
}