Elastic Search
Elastic Search
Implementando bsquedas de
datos eficientes y escalables
Fernando A. Rodriguez
(Desarrolador Sr, SYI)
Federico A. Ocampo
(Supervisor, Buyingflow)
... y Elasticsearch
Orientado a documentos
JSON's, Basado en Apache Lucene
Libre de schemas
Aunque permite definirlos de ser necesario
Distribuido
Escala dinmicamente, implementa HA
Multi-Tenant
Permite operar sobre mltiples ndices a la vez
Centrado en API's
Expone casi todas sus funcionalidades va APIs REST
Bsquedas no estructuradas
Todos los items que contengan la palabra curso.
Bsquedas estructuradas
Items oro vendidos por el user X en Marzo.
Aggregations / Facetas
Promedio de precios de los items de la categora C.
# Crear un documento
curl -XPOST "http://localhost:9200/items/item/MLA1" -d '{
"title" : "Condensador de flujo XT-2000"
}'
# Borrar por ID
curl -XDELETE "http://localhost:9200/items/1"
Performance
Escalabilidad
Alta disponibilidad
Tolerancia a fallos
No confundir con
ndices de bases de
datos
Preguntas
Compras
USUARIO
NODO
NODO1 ES
Cluster: springfield USUARIO
preguntas
Indice: usuario {...}
compras
Tipo: preguntas {...}
Particin de la informacin.
2 shards
1 shard
NODO 1
Usuario Pregunta
Usuario
NODO 1 Pregunta
homero p1
homero p1
homero p2
homero p2
lisa p3
lisa p3
moe p4
moe p4
bart p5
bart p6
bart p7 Usuario Pregunta
bart p8 bart p5
bart p6
bart p7
bart p8
NODO 1 NODO 2
Shard 0 Shard 1
(primario) (primario)
Shard 1 Shard 0
(replica) (replica)
Agregando un nodo...
Shard 0 Shard 1
(primario) (primario)
Shard 1 Shard 0
(replica) (replica)
Shard 0 Shard 1
(primario) (primario)
Shard 0 Shard 1
(primario) (primario)
Shard 1 Shard 0
(replica) (replica)
Shard 0 Shard 1
(primario) (primario)
Shard 1 Shard 0
(replica) (replica)
Shard 1 Shard 0
(primario) (primario)
Shard 0 Shard 1
(replica) (replica)
NODO 1 NODO 2
Tipos bsicos
String, number, boolean
Tipos complejos
Array, Object
Tipos extendidos
Datetime, binary (base 64), ip, geo_point, multi-filed...
nombre
operacin nombre tipo
ndice ID documento
HTTP REST
nombre
operacin nombre tipo
HTTP REST ndice
Ejecucin distribuida:
nombre
operacin nombre tipo
ndice ID documento
HTTP REST
{
contenido del ...
campo "_id" : "MLA1234",
"_fields" : {
"seller_id": 123136,
"item_id": MLA1234,
...
}
}
Ejecucin distribuida:
3. Se accede finalmente al
shard y se obtiene el
documento.
Respuestas:
200 (CREATED): Si se borr el documento
Ejecucin distribuida:
Operacin a realizar
Formato de respuesta:
Contiene una respuesta individual para cada operacin.
Se garantiza el orden entre operaciones y respuestas
la respuesta de la 3era operacin est en 3er lugar
Si falla una operacin, el resto no se ve afectado.
A tener en cuenta en caso de consumir mensajes de una cola.
Cada respuesta incluye los conocidos datos de _index,
_type y _id y por supuesto el contenido del documento o
un descriptor de "error".
Relevancia (Scoring)
Define qu tan importante es un documento en un conjunto de resultados
Spellchecker
Permite interpretar una bsqueda aunque tenga errores ortogrficos
Soporte multi-lenguaje
Permite interpretar bsquedas en diferentes idiomas
Autocomplete
Predice la bsqueda en base a las primeras palabras ingresadas y ofrece
posibles alternativas comunes.
Header de la respuesta:
tiempo insumido (ms) {
"took" : 5,
'true' si di timeout "timed_out" : false,
"_shards" : {
"total" : 5,
shards involucrados "successful" : 5,
(exitosos y fallidos) "failed" : 0
},
...
}
Cuerpo de la respuesta:
Ejecucin distribuida:
Shard 1 Shard 1
2. El server determina en (primario) (replica)
qu shards (primario o
rplica) se encuentran los Shard 0 2. Shard 0
(replica) (primario)
documentos (search)
Cliente
Index
Cliente
Index
Cliente
Formato: {
"query": {
"filtered": {
Queries "query": {
"match": {"title":"iphone 4s"}
Filtros },
"filter": {
"term": {"status": "active"}
}
}
}
}
{
match : {titulo : Star Wars 25}
}
{
match : {
text : {
type : boolean,
query : lannister saludos,
min_should_match : 30%
}
}
}
Buscando frases...
Bsquedas de frases dentro de un string
permiten no matchear
{
match : {
text : {
type : phrase,
query : Argentina sali campen,
slop : 1
}
}
}
{
match : {
text : {
type : phrase_prefix,
query : Argentina sali,
"max_expansion" : 100
}
}
}
{
"multi_match" : {
"fields" : ["titulo","descripcion","atributo.*"],
"query" : Item de testeo,
}
}
{
"bool" : {
"must" : [
{"match" : {"tipo" : "cerveza"}},
{"match" : {"tamao" : 250}}
],
"must_not" : [
{"match" : {"marca" : "quilmes"}}
]
}
}
{
"match_all" : { }
}
Term query
Bsqueda sobre campo sin parsear
Prefix/Wildcard query
Bsqueda parcial sobre campo sin parsear
Fuzzy query
Bsqueda difusa sobre campo sin parsear
Regexp query
Poco performante
Varios tipos
term,bool,and,or,not,range,geo_distance,...
Pueden usarse en
filtered query
constant_score query
aggregations
Cacheable! (super rpido)
Queries Filters
Bsquedas por texto y trminos Slo trminos (responde a la
pregunta si/no)
Con relevancias Sin relevancia
Rpido (segn query) Muy Rpido
Sin caching Cacheable
"filtered":{
"query":{ ...query de bsqueda... },
"filter":{
Composicin de
"and":[
{"term": {"listing":"silver"}},
query y filters...
{"term": {"seller": 76060303}}
]
}
}
{
"from" : 10, "size" : 30,
paginado "query" : {
"filtered" : {
"filter" : {
"term" : {
"seller_id" : "76060303"
}
}
}
},
Ordenamiento "sort" : [ {
"start_time" : {
"order" : "desc",
"missing" : "_last"
}
}]
}
...y entonces?
ndices invertidos!
ndices invertidos:
Rob 3 1,2,3
John 1 5
Arya 2 1,4
Ned 1 3
Tokenizing
Dividir el texto en trminos significativos ("la casa" => ["la", "casa"])
Stopwords
Ignorar los trminos comunes de cada lenguaje (Ej: artculos)
Ignorar 'capitalizacin'
No diferenciar maysculas de minsculas.
Ignorar caracteres especiales
No diferenciar caracteres especiales de su versin original (Ej: => a)
Stemming
Transformar una palabra a su "raz" (Ej: jugando => jugar).
Sinnimos
Incluir en una bsqueda a los sinnimos (Ej: triunfar => ganar).
Tokenizing
ignore-case filters
stopwords filters
Tokenizer
Divide el texto en trminos (tokens) en base a reglas definidas,
generando una cadena de tokens (token stream).
Por ejemplo: keyword, whitespace, standard, regex, etc...
Token Filter
Actua sobre un token stream modificndolo y/o creando nuevos tokens.
Por ejemplo: asciifolding, lowercase, stopword, ngram, etc...
Opera en cadena (pipelining): la salida de un filter es la entrada de otro.
Anlisis en la indexacin:
Anlisis en la bsqueda:
query query
Tokenizer Filter
Filter
Filter Search
"match":"la ola" "match":"ola"
Filters: "Elstico"
Principio de "Schema-less"
Slo configurar cuando es necesario
Tipos de datos
Los infiere de los tipos de datos bsicos de JSON (boolean, string, etc.)
ip Direccin ipv4
Parametros extras
Tipo Descripcin
Tipo Descripcin
Tipo Descripcin
Tipo Descripcin
Tipo Descripcin
{
"mensaje" : {
"type" : "object",
"properties" : {
"usuario" : {
"type" : "object",
"dynamic" : false,
"properties" : {
"nombre" : {"type" : "string"},
"apellido" : {"type" : "string"}
"id" : {"type" : "string", "index" : "not_analyzed"}
}
},
"texto" : {"type" : "string"}
}
}
}
"item" : {
"properties" : {
"titulo" : {
"type" : "multi_field"
"fields" : {
"titulo" : { "type" : "string",
"index" : "not_analyzed" }
"espanol" : { "type" : "string",
"analyzer" : "custom_es" },
"portugues" : { "type" : "string",
"analyzer" : "custom_pt" }
}
}
}
}
Algoritmos
Procesan informacin de la frecuencia de aparicin de los trminos
buscados en los documentos encontrados.
Boosting
Operacin para dar "peso" a ciertos documentos o campos, en base a
requerimientos funcionales que los algoritmos no tienen en cuenta:
temporalidad, tipos de documentos, etc.
Algoritmo TF-IDF
Por cada trmino se calcula el TF. Luego este valor se pondera con la
relevancia IDF.
Lucene Similarity:
"hits":{
Algoritmo implementado por "total":1,
Lucene para scoring. "max_score":0.3125,
"hits":[
{
Implementacin de TF-IDF. "_index":"items",
"_type":"item",
Incorpora normalizacin y "_id":"MLA123",
"_score":0.3125,
boosting.
"_source":{
"id":"MLA123",
Se ejecuta en cada bsqueda de "title":"Cmara Sony HD"
texto libre (match) }
}
]
Documento 1: Documento 2:
Documento 1: Documento 2:
En tiempo de indexacin:
Cuando consideramos que cierto documento ser siempre ms
importante que otros (Ej: la home-page de un sitio).
Es ms performante ya que no requiere clculos extra.
Si se quiere modificar, requiere reindexar el documento.
"bool" : {
"should" : [
{
"match": {
"site": {
"query": "Alamaula"
}
}
},
{
"match": {
"site": {
"query": "Mercadolibre"
"boost": 1.5
}
}
}
]
}
"custom_score": {
"query": { ...bsqueda de empleados... },
"script":
"_score * (doc['puesto'].value == 'capo'? 1.2 : 1)"
}
El buscador del site debe priorizar los artculos por sobre los videos. Si un texto se
encuentra en el ttulo de un artculo, ste es ms importante que si se encontrase
en el cuerpo del mismo.
1. Las descripciones de los videos tendrn mayor scoring que los artculos de
texto por ser ms cortas: boost a los artculos.
2. Entre los artculos, los ttulos tendrn ms relevancia por ser ms cortos.
"custom_filters_score": {
"query": { ...bsqueda realizada... },
"filters": [
{
"filter": {
"term": {
"puesto": "capo"
}
},
"boost": 1.2
}
]
}
Para qu sirve?
Proveen contadores con resultados de las bsquedas
http://demo.kibana.org/
Buckets
Documentos que cumplen una determinada condicin
Equivalente a GROUP BY de SQL
Ej: Artculos agrupados por categora
Metrics
Funciones matemticas aplicadas sobre los buckets
Equivalente en SQL: COUNT, AVG, SUM, MAX, etc
Ej: Precio promedio
Combinacin de ambos
Un caso comn es utilizar una combinacin entre buckets y metrics
Ej: Calcular el precio promedio por categora
Composicin de buckets
Es posible definir buckets dentro de buckets permitiendo agrupar por
ms de un crterio
Ej: Calcular el precio promedio por categora, listing type y si tiene free
shipping
Request:
{
"aggs": {
Nombre "categoria": {
"terms": { "field": "category_id" },
"aggs": {
Buckets "tipo_publicacion" : {
"terms" : { "field" : "listing_type_id"},
"aggs" : {
"prom_precio" : { "avg": { "field": "price"} },
Metrics
"min_precio" : { "min": { "field": "price"} },
"max_precio" : { "max": { "field": "price"} }
}
}
}
}
}
}
Response
aggregations: {
categoria: {
buckets: [
{
key: MLA34370
doc_count: 19
tipo_publicacion: {
buckets: [
{
key: bronze
doc_count: 16
prom_precio: {value: 175.125}
min_precio: {value: 49}
max_precio: {value: 350}
},
}
Global
Las aggregations se aplican sobre el total los datos (no de la bsqueda)
Filter bucket
Las aggregations se aplican sobre los resultados de la bsqueda + filtro
especifico dado
Term
Devuelve los n trminos ms frecuentes
Stats
Informacin estdistica de los resultados (mximo, mnimo, media,
variancia, desviacin estandard, etc)
Percentiles
Genera los percentiles sobre un campo numrico y calcula la frecuencia
Range / Date / histogram
Permite definir rangos y devuelve la frecuencia
geo distance
Dado un punto y rangos de distancia dados, devuelve la cantidad de
ocurrencias
Transport Client
Cliente "liviano"
No se integra con el cluster (no se ejecuta node_discovery)
Se crea y destruye rpidamente. Ideal para mltiples threads
Ejecuta requests en modo round-robin
Requiere que se defina una lista de nodos con los que comunicarse.
Si algn nodo se diese de baja, da timeout y contina con otro.
Cliente
Node Client
Cliente
Algunos ejemplos
Wikipedia
Twitter
RabbitMQ
Dropbox
Manual
Bajar, descomprimir y configurar.
Automatizado
Cheff (http://www.opscode.com/chef)
Puppet (http://www.puppetlabs.com/)
Paquetes Debian
... a la Melicloud
Incluir ES como parte del repositorio con sus configuraciones base.
Cada nuevo deploy sobreescribe las configuraciones
Los cambios aplican a todos los servers por igual.
Archivos de la distribucin
LICENSE.txt
NOTICE.txt
README.textile
bin
elasticsearch
elasticsearch.in.sh
plugin
config
elasticsearch.yml
logging.yml
data
elasticsearch
lib
elasticsearch-x.y.z.jar
...
logs
elasticsearch.log
elasticsearch_index_search_slowlog.log
Directorios principales
Nombre Descripcin
Nombre Descripcin
Nombre Descripcin
Nombre Descripcin
Aggregations
Cargan en memoria los valores de los campos referenciados.
No facetar por campos analized o con muchos valores posibles.
Filtros y Ordenamiento
Cargan en memoria los valores de los campos referenciados.
Puede monitorearse con la API de Stats.
Lucene
Aunque muy optimizado, carga diccionario invertido en memoria.
Afecta slo cuando hay muchos shards ejecutando en un mismo nodo.
Qu infraestructura se recomienda?
Cluster Health:
Semforo indicador del estado del cluster
Verde: los shards primarios y las rplicas estn inicializadas.
Amarillo: todos los shards primarios estn iniciados pero faltan rplicas.
Rojo: faltan shards primarios y rplicas (falta informacin)
Cluster Info/Stats:
Info: informacin esttica del cluster que no vara.
Stats: informacin del cluster que vara con el tiempo.
Cubren todos los aspectos de SO, JVM, Red, etc.
BigDesk
Permite monitorear todos los aspectos de ejecucin de cada nodo.
Elasticsearch-Head
Permite visualizar la topologa y el comportamiento de los shards.
Permite navegar la informacin y generar queries libres o prearmadas.
Paramedic:
Monitor de ejecucin de todo el cluster en una sola pantalla.
Elasticsearch HQ
Monitor y administrador del sistema (excelente interfaz)
Al indexarlos
curl -X POST localhost:9200/user/user/?percolate=* -d '{
"reputation" : "5_red","negative_calif" : 23
}'
Resultado
{ "ok" : true, "matches" : ["usuario-trucho"]}
"geo_distance" : {
"distance" : "400km"
"location" : { "lat" : 40.73, "lon" : -74.1 }
}
Libro oficial de ES
http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/
Advanced Scoring en ES
http://jontai.me/blog/2013/01/advanced-scoring-in-elasticsearch/
Pre-Flight checks (setup para produccin)
http://www.elasticsearch.org/webinars/elasticsearch-pre-flight-checklist
DSL Explained
http://www.slideshare.net/clintongormley/terms-of-endearment-the-
elasticsearch-query-dsl-explained
Foro de ES en espaol
https://groups.google.com/forum/#!forum/elasticsearch-es