Cómo realizar consultas en ELASTICSEARCH

Henry Gadea
NicaSource
Published in
5 min readSep 8, 2022

En este artículo encontraremos algunas definiciones básicas y ejemplos de cláusulas y estructuras necesarias para ejecutar una consulta de manera correcta en Elasticsearch

¿Qué es Elasticsearch?

Según la página oficial, Elastic es “motor de búsqueda y analítica distribuido, gratuito y abierto para todos los tipos de datos, incluidos textuales, numéricos, geo espaciales, estructurados y no estructurados.(…) Conocido por sus API REST simples, naturaleza distribuida, velocidad y escalabilidad.

Elasticsearch distingue entre dos tipos de búsquedas:

  • Las búsquedas que devuelven una puntuación o score, llamadas queries. Están pensadas para búsquedas sobre campos de tipo frase, ya que este tipo de consultas lo que hacen es medir cuánto se parece una frase buscada a la almacenada.
  • Las búsquedas sin puntuación o filtros. Estas se utilizan para búsquedas binarias, en las que hay dos posibilidades, o se encuentra el valor o no se encuentra. Tienen la ventaja que son más rápidas y que se cachean en memoria. Este tipo de búsquedas se utilizan para campos que no sean de texto.

Elasticsearch proporciona un lenguaje basado en JSON para definir consultas llamado DSL (Domain Specific Language). Las consultas DSL son una especie de AST (Abstract Syntax Tree), que constan de dos tipos de cláusulas:

Cláusulas de consulta de hoja

Esta cláusula busca un valor concreto en un campo determinado, como, por ejemplo, las consultas match, term o range Este tipo de consultas pueden utilizarse por sí solas.

Cláusulas de consulta compuesta

Esta cláusula envuelve otras consultas de hoja o compuestas y son utilizadas para combinar varias consultas de forma lógica (como las consultas bool o dis_max), o para alterar su comportamiento (como la consulta constant_score).

Tipos de búsquedas

Existen cláusulas comunes para las consultas tales como:

  • term: busca que un campo sea igual a un valor.
  • match: comprueba si un texto tiene una palabra concreta (token).
  • match_phrase: comprueba si un texto contiene una lista de palabras en el orden brindado.

Para hacer búsquedas por rangos de campos numéricos, se utiliza:

  • gt: mayor que
  • gte: mayor o igual que
  • lt: menor que
  • lte: menor o igual que

Adicionalmente, Elasticsearch nos brinda la posibilidad de usar dos operadores para realizar consultas:

  • should: es el equivalente a OR en otros lenguajes. Se indican dos o más condiciones y basta con complir una de ellas para que devuelva un resultado.
  • must: es el equivalente a AND en otros lenguajes. Este operador permite unir dos o más condiciones, es decir, se tiene que cumplir todas las condiciones definidas para que devuelva un resultado.

Ejemplos de búsquedas

Registro de datos de ejemplo

PUT empleados/empleado/1

{“nombre”:”Pedro Pérez”,”edad”:”25”,”ciudad”:”Granada”}

PUT empleados/empleado/2

{“nombre”:”Pedro García”,”edad”:”35”,”ciudad”:”Managua”}

PUT empleados/empleado/1

{“nombre”:”Juan Pérez”,”edad”:”41”,”ciudad”:”Managua”}

Consultas

Obtener todos los resultados del índice

GET _search

{

“query”:{

“match_all”:{ }

}

}

Búsqueda por un campo que sea igual a un valor

El empleado debe tener la edad exacta de 25 años.

La búsqueda debe arrojar una. coincidencia:

  1. Pedro Pérez de 25 años.

GET empleados/empleado/_search

{

“query”:{

“bool”:{

“filter”:{

“term”:{

“edad”:25

}

}

}

}

}

Búsqueda por rango

El empleado debe tener una edad mayor o igual a 30 años.

La búsqueda debe arrojar dos coincidencias:

  1. Pedro García de 35 años.
  2. Juan Pérez de 41 años.

GET empleados/empleado/_search

{

“query”:{

“bool”:{

“filter”:{

“range”:{

“edad”:{

“gte”:30

}

}

}

}

}

}

Búsqueda compuesta utilizando el operador OR

En este caso vamos a buscar que se cumpla una de las siguientes dos condiciones:

  • La ciudad del empleado debe ser igual a Granada.
  • La edad del empleado debe ser mayor o igual a 40.

La búsqueda debe arrojar dos coincidencias:

  1. Pedro Pérez que vive en Granada y tiene 25 años.
  2. Juan Pérez que vive en Managua y tiene 41 años.

GET empleados/empleado/_search

{

“query”:{

“bool”:{

“filter”:{

“bool”:{

“should”:[

{

“term”:{

“ciudad”:”granada”

}

},

{

“range”:{

“edad”:{

“gt”:40

}

}

}

]

}

}

}

}

}

Búsqueda compuesta utilizando el operador AND

En este caso vamos a buscar que se cumplan todas las condiciones:

  • La ciudad del empleado debe ser igual a Managua.
  • La edad del empleado debe ser mayor o igual a 40.

La búsqueda debe arrojar una coincidencia:

  1. Juan Pérez que vive en Managua y tiene 41 años.

GET empleados/empleado/_search

{

“query”:{

“bool”:{

“filter”:{

“bool”:{

“must”:[

{

“term”:{

“ciudad”:”managua”

}

},

{

“range”:{

“edad”:{

“gt”:40

}

}

}

]

}

}

}

}

}

Búsqueda a campos de tipo texto

En este ejemplo, realizaremos una búsqueda donde el nombre del empleado contenga las palabras clave “Pérez” y “Pedro” utilizando la cláusula match.

La búsqueda debe arrojar una coincidencia:

  1. el empleado de nombre Pedro Pérez.

Esto debido a que la cláusula match busca por palabra clave sin importar el orden de las mismas

GET empleados/empleado/_search

{

“query”:{

“match”:{

“nombre”:”Pérez Pedro”

}

}

}

En caso contrario, si necesitamos que la búsqueda respete el orden de las palabras, utilizaremos la cláusula match_phrase.

La búsqueda debe arrojar cero coincidencias, debido a que ningún nombre de empleado utiliza esas palabras claves en ese orden.

GET empleados/empleado/_search

{

“query”:{

“match_phrase”:{

“nombre”:”Pérez Pedro”

}

}

}

De la misma manera, podremos realizar búsquedas compuestas utilizando la cláusula bool y must.

La búsqueda debe arrojar una coincidencia:

  1. el empleado de nombre Pedro Pérez.

GET empleados/empleado/_search

{

“query”:{

“bool”:{

“filter”:{

“bool”:{

“must”:[

{

“term”:{

“nombre”:”pedro”

}

},

{

“term”:{

“nombre”:”pérez”

}

}

]

}

}

}

}

}

Elasticsearch es una excelente herramienta para realizar búsquedas y análisis en tiempo real en datos de transmisión. Su estructura de datos única organiza y busca datos en documentos y hace que se puedan buscar casi en tiempo real. La aplicación de código abierto maneja múltiples idiomas y una gran cantidad de datos no estructurados en formatos de documentos. No gestiona datos de series temporales y bases de datos desarrolladas para tal fin, como InfluxDB y MongoDB.

Usar Elasticsearch ha sido adoptado por algunas marcas importantes, como: Tesco, Linkedin, Foursquare, Facebook, Netflix, Dell, Ebay, Wikipedia, The Guardian, New York Times, Salesforce, Docker, Orange, Groupon, Eventbrite y muchos otros.

Si quieres profundizar más sobre esta tecnología, te recomiendo ir a la documentación oficial dando clic al siguiente enlace Elasticsearch.

Que disfrutes tu búsqueda.

--

--