Introducción básica a ElasticSearch
El ultimo mes estuve trabajando con elasticsearch, se me ha ocurrido hacer una introducción básica porque he visto a muchos de mis compañeros qué les puede interesar.
¿Qué es y por qué surge?
El surgimiento de Elasticsearch se debió a problemas de escalabilidad, este es un motor de búsqueda diseñado para escalar horizontalmente, de forma que se puedan ir añadiendo más nodos al clúster a medida que aumente el volumen de datos requerido.
Características
Aparte de la característica fundamental de la escalabilidad horizontal, otras características de Elasticsearch son:
- Tiempos próximos al tiempo real: latencias menores que 1 segundo.
- Tolerancia a fallos: hay alta disponibilidad de los datos al replicar los datos en distintos nodos.
- Búsquedas de texto completo: capaz de analizar todo el contenido de documentos y no solo campos concretos.
- Orientado a documentos JSON
- No requiere esquemas, se auto-detectan los tipos de los campos de los documentos
- Desarrollo amigable al disponer de APIs sencillas
Búsquedas
Queries: pensadas para búsquedas sobre frases. Mide cuánto se parece frase buscada a la almacenada.
Filtros: para búsquedas binarias (sí/no). Más rápidas y se cachean en memoria. Utilizamos campos no sean texto.
API unificada: filter se usa dentro de query. Podemos tener query sólo con filter o parte con score y parte con filter
Frases se dividen en tokens, en minúscula: - “Pedro Santos González” [“pedro”,”santos”,”gonzález”]
Al hacer consulta “Pedro García”, token “pedro” coincide: asigna una puntuación aunque no coincida exactamente.
Sintaxis de la query
GET indice/tipo/_search
{ { "query": { <tipoClausula>:{<campoConsultado>:<valor>} } } }
Sintaxis de filters como único elemento de la query
GET indice/tipo/_search
{ { "query": { "bool":{ "filter"{ <tipoClausula>:{<campoConsultado>:<valor>} } } } } }
Cláusulas comunes en queries
- Campo igual a valor: term
- Texto contiene palabra (token): match
- Texto contiene palabras en orden dado: match_phrase
- Campo en un rango: (gt, gte, lt, lte)
- Búsquedas compuestas: bool
- Operador OR
<>
should (condicion1 || condicion2) - Operador AND
<>
must (condicion1 && condicion2) - También agregaciones (aggs, como media, avg)