You are on page 1of 182

Elasticsearch

Implementando búsquedas de
datos eficientes y escalables

Cool... bonsai cool

Curso de capacitación - Mercadolibre SRL Julio 2014
¿Quiénes somos?

Fernando A. Rodriguez
(Desarrolador Sr, SYI)

Federico A. Ocampo
(Supervisor, Buyingflow)

Curso de Capacitación - Julio 2014
Objetivos

● Introducir al mundo de los motores de búsquedas y
sus desafíos.
● Aprender las características centrales de
Elasticsearch (y Lucene)...
● ...y cómo utilizarlas para encarar estos desafíos.
● Todo esto teniendo en cuenta los requerimientos de
performance y escalabilidad de Mercadolibre

Curso de Capacitación - Julio 2014
Agenda
Día 1 Día 2
● Introducción ● Mapping
● Capa distribuida ● Relevancia (Scoring)
● E/S de datos ● Aggregations
● Búsquedas básicas ● Integración
● Lucene ● Puesta en Producción
● Búsquedas avanzadas ● Funcionalidades
● Analyzers avanzadas

Curso de Capacitación - Julio 2014
Búsquedas
Las búsquedas son la principal interfaz
para la obtención de información en la
actualidad.

Curso de Capacitación - Julio 2014
Búsquedas: Motores conocidos

Curso de Capacitación - Julio 2014
Búsquedas: Motores conocidos

Curso de Capacitación - Julio 2014
Búsquedas: Motores conocidos

Curso de Capacitación - Julio 2014
Búsquedas: desafíos

Pero las búsquedas tienen sus
desafíos...

Curso de Capacitación - Julio 2014
Búsquedas: desafíos

Curso de Capacitación - Julio 2014
Búsquedas: desafíos

Curso de Capacitación - Julio 2014
Búsquedas: desafíos

?

?

Curso de Capacitación - Julio 2014
Búsquedas: herramientas

Existen muchos productos y herramientas para
implementar búsquedas de texto...
● Bases de datos relacionales (SQL)
● Bases No relacionales (MongoDB)
● Soluciones Ad-Hoc ("te lo hago en bash")
● Motores de búsqueda full-text-search (Solr)

... y Elasticsearch

Curso de Capacitación - Julio 2014
Introducción a
Elasticsearch

Curso de Capacitación - Julio 2014
¿Qué es Elasticsearch?

Es un motor de búsqueda, orientado a
documentos, basado en Apache Lucene

Curso de Capacitación - Julio 2014
Breve reseña histórica

● Creado por Shay “Kimchy” Banon en el 2010:
“...ElasticSearch itself was born out of my frustration with the fact that there isn’t really
a good, open source, solution for distributed search engine out there”

● Mantenido por él hasta la creación de Elasticsearch.com
(http://elasticsearch.com/) en 2012

● Actualmente desarrollado por la empresa, bajo licencia
Apache 2 (muy flexible).

● La última versión a la fecha es la 1.3.2 (Requiere Java 7.x)

Curso de Capacitación - Julio 2014
¿Qué características tiene?

● Orientado a documentos
○ JSON's, Basado en Apache Lucene

● Libre de schemas
○ Aunque permite definirlos de ser necesario

● Distribuido
○ Escala dinámicamente, implementa HA

● Multi-Tenant
○ Permite operar sobre múltiples índices a la vez

● Centrado en API's
○ Expone casi todas sus funcionalidades vía APIs REST

Curso de Capacitación - Julio 2014
¿Y qué puede hacer?

● Búsquedas no estructuradas
○ Todos los items que contengan la palabra “curso”.

● Búsquedas estructuradas
○ Items “oro” vendidos por el user “X” en Marzo.

● Aggregations / Facetas
○ Promedio de precios de los items de la categoría “C”.

● Combinaciones de todo lo anterior
○ Promedio de precios de los items vendidos en Abril de

los usuarios “X” e “Y” en la categoría “C”.
● … y todo en tiempo “casi” real!

Curso de Capacitación - Julio 2014
Una muestra gratis :¬)

# Crear un documento
curl -XPOST "http://localhost:9200/items/item/MLA1" -d '{
"title" : "Condensador de flujo XT-2000"
}'

# Obtener un documento por ID
curl -XGET "http://localhost:9200/items/item/1

# Buscar un documento por texto
curl -XGET "http://localhost:9200/items/_search?q=Condensador"

# Borrar por ID
curl -XDELETE "http://localhost:9200/items/1"

Curso de Capacitación - Julio 2014
Todo muy lindo pero.. ¿quién lo usa?

Curso de Capacitación - Julio 2014
Componentes principales

Elasticsearch se compone de dos capas principales
bien definidas y desacopladas:
● Sistema distribuido
○ Implementa la lógica de coordinación de los nodos
de un cluster y el mantenimiento de sus datos
● Motor de búsqueda
○ Proporciona las funcionalidades de indexación y
búsqueda de documentos.

... veamos como funciona la primera

Curso de Capacitación - Julio 2014
Sistema
distribuido

Curso de Capacitación - Julio 2014
Sistema distribuido: introducción

¿Qué esperamos en Meli de un sistema distribuido?

● Performance
● Escalabilidad
● Alta disponibilidad
● Tolerancia a fallos

Curso de Capacitación - Julio 2014
Sistema distribuido: glosario

Cluster Nodos Indices Tipos
Conjunto de Instancia de Colección de varios Colección de varios
instancias de ES Elasticsearch documentos documentos de
que comparten (objeto JSON), no similar estructura
mismo nombre necesariamente de
(cluster.name)
igual estructura. Comparable a
tablas de bases de
Comparable a datos
esquemas de bases
de datos

No confundir con
índices de bases de
datos

Curso de Capacitación - Julio 2014
Sistema distribuido: Ejemplo

Preguntas

Compras

USUARIO

NODO
NODO1 ES
Cluster: springfield USUARIO
preguntas
Indice: usuario {...}
compras
Tipo: preguntas {...}

Curso de Capacitación - Julio 2014
Sistema distribuido: más sobre shards

● Partición de la información.

● Puede ser Primario (read/write) o Réplica (read-only).

● Un nodo puede administrar 1 o más shards.

● La cantidad de shards primarios son definidos al crear el
índice y luego no se puede modificar

● Proveen alta disponibilidad y performance.

● Instancias de lucene independientes entre sí .

Curso de Capacitación - Julio 2014
Sistema distribuido: Ejemplo shard

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

Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas

NODO 1 NODO 2

Shard 0 Shard 1
(primario) (primario)

Shard 1 Shard 0
(replica) (replica)

curl -XPUT localhost:9200/test -d '{
"index" : {
"number_of_shards" : 2,
"number_of_replicas" : 1
}
}'

Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas

Agregando un nodo...

NODO 1 NODO 2 NODO 3

Shard 0 Shard 1
(primario) (primario)

Shard 1 Shard 0
(replica) (replica)

Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas

...se balancea el cluster automáticamente.

NODO 1 NODO 2 NODO 3

Shard 0 Shard 1
(primario) (primario)

Shard 1 Shard 0 Shard 0
(replica) (replica) (replica)

Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas

...se balancea el cluster automáticamente.

NODO 1 NODO 2 NODO 3

Shard 0 Shard 1
(primario) (primario)

Shard 1 Shard 0
(replica) (replica)

Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas

Ante la caida de un nodo...

NODO 1 NODO 2 NODO 3

Shard 0 Shard 1
(primario) (primario)

Shard 1 Shard 0
(replica) (replica)

Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas

... se regeneran los shard faltantes

NODO 1 NODO 2 NODO 3

Shard 1 Shard 0
(primario) (primario)

Shard 0 Shard 1
(replica) (replica)

Curso de Capacitación - Julio 2014
Sistema distribuido: simulación

NODO 1 NODO 2

Vamos a experimentar un poco
con los shards...

Curso de Capacitación - Julio 2014
Data In / Out

Curso de Capacitación - Julio 2014
Estructura de datos

● Los documentos se representan en formato JSON
● Cada campo contiene información de cierto tipo.
{
"id": "MLA464468956",
"title": "Departamento 3 Ambientes En Alquiler - Claypole R",
"price": 5000,
"geolocation": {
"latitude": -34.56854,
"longitude": -58.4678583,
},
"pictures": [
{"url": "http://img2.mlstatic.com/s_MLA_v_O_f_447_062013.jpg"},
{"url": "http://img2.mlstatic.com/s_MLA_v_O_f_534_062014.jpg"}
],
"date_created": "2013-06-12T18:46:00.000Z",
}

Curso de Capacitación - Julio 2014
Estructura de datos

● ES agrega su propia Metadata a los documentos

Campo Default Descripción
_id ID interno del documento
_type Tipo de documento
_source enabled Guarda el doc original indexado
_all enabled Indexa todos los valores de todos los campos
del documento.
_timestamp disabled timestamp asociado al documento
_ttl disabled define una fecha de expiración (opcional)
_size disabled almacena el tamaño del _source
descomprimido

Curso de Capacitación - Julio 2014
Tipos de datos

ES soporta los tipos de datos propios de JSON y otros
tipos derivados, propios del sistema:

● Tipos básicos
○ String, number, boolean

● Tipos complejos
○ Array, Object

● Tipos extendidos
○ Datetime, binary (base 64), ip, geo_point, multi-filed...

...más detalles cuando veamos Mapping

Curso de Capacitación - Julio 2014
Insertando datos: Index API

Primero necesitamos un índice...
Nombre del índice

curl -XPUT ‘localhost:9200/items’ -d '{
"settings" : {
...
},
"mappings" : {
...
}
}' Configuraciones opcionales

... aunque si no lo creamos, ES lo hace por nosotros usando
una configuración por defecto.

Curso de Capacitación - Julio 2014
Insertando datos: Index API

Luego agregamos la información...

nombre
operación nombre tipo
índice ID documento
HTTP REST

curl -XPUT 'localhost:9200/items/item/MLA123' -d '{
"id" : "MLA-123"
"title" : "Delorean modelo '85, joya nunca taxi",
"kmts" : 325000
"seller": "MACFLY_1980"
}'
documento JSON
a indexar

Curso de Capacitación - Julio 2014
Insertando datos: Index API

Podemos dejar que ES defina el ID automáticamente...

nombre
operación nombre tipo
HTTP REST índice

curl -XPOST 'localhost:9200/items/item' -d '{
"id" : "MLA-123"
"title" : "Delorean modelo '85, joya nunca taxi",
"kmts" : 325000
"seller": "MACFLY_1980"
}'
documento JSON
a indexar

Curso de Capacitación - Julio 2014
Insertando datos: Index API

... obteniendo como respuesta:
● 201 (CREATED): Se creó un nuevo documento
● 200 (OK): Se actualizó un documento existente

nombre del índice {
"ok" : true,
nombre del tipo
"_index" : "items",
id del documento "_type" : "item",
"_id" : "MLA123",
versión del cocumento "_version" : 1
}

Curso de Capacitación - Julio 2014
Insertando datos: Index API

Ejecución distribuida:

1. Se genera el request a un NODO 1 NODO 2
nodo dado. 3.
Shard 1 Shard 1
2. El server lee el valor de (primario) (replica)

routing (por defecto el
Shard 0 Shard 0
_id) y determina en cuál (replica) (primario)
shard primario (Shard 1) 2.
se indexa el documento

3. Una vez indexado el
documento en el shard 1.
primario, se propaga a $curl -XPUT ... Cliente
las réplicas

Curso de Capacitación - Julio 2014
Obteniendo datos: Get API

● Permite obtener un documento dado su tipo y ID

nombre
operación nombre tipo
índice ID documento
HTTP REST

curl -XGET 'localhost:9200/items/item/MLA1234'

● La operación GET se realiza en tiempo real
○ En el momento en que se indexa un documento, está

inmediatamente disponible para ser obtenido vía GET

Curso de Capacitación - Julio 2014
Obteniendo datos: Get API

... obteniendo como respuesta:

● 200 (CREATED): Si el documento existe
● 404 (NOT FOUND): Si no existe

nombre del índice {
"exists" : true,
nombre del tipo "_index" : "items",
"_type" : "item",
id del documento "_id" : "MLA1234",
"_version" : 1
versión del cocumento "_source" : {
"id" : "MLA1234"
contenido del "title" : "Delorean...",
"kmts" : 325000,
documento
"seller": "MACFLY_1980"
}
}

Curso de Capacitación - Julio 2014
Obteniendo datos: Get API

● También pueden obtenerse ciertos campos específicos.
○ Permitir reducir tráfico de red en GETs de documentos grandes.

curl -XGET 'localhost:9200/items/item/MLA1234?
_source_include=*id&_source_exclude=*picture

{
contenido del ...
campo "_id" : "MLA1234",
"_fields" : {
"seller_id": 123136,
"item_id": “MLA1234”,
...
}
}

Curso de Capacitación - Julio 2014
Obteniendo datos: Get API

Ejecución distribuida:

1. Se genera el request NODO 1 NODO 2

2. El server lee el valor de Shard 1 Shard 1
(primario) (replica)
routing (por defecto el _id)
3
y determina en qué shard Shard 0 Shard 0.
se encuentra el documento (replica) (primario)
(Shard 1).
2.
Luego el nodo receptor
realizar un round-robin
entre todos los shards 1.
primarios y réplicas
$curl -XGET ... Cliente

3. Se accede finalmente al
shard y se obtiene el
documento.

Curso de Capacitación - Julio 2014
Obteniendo datos: Get API

● Si solamente se quiere saber si existe el documento
○ Evita el overhead de transferir el JSON.

curl -XHEAD 'localhost:9200/items/item/MLA1234'

● Si solamente quiere obtenerse el _source
○ Sin metadatos extra

curl -XGET 'localhost:9200/items/item/MLA1234/_source'

Curso de Capacitación - Julio 2014
Eliminando datos: Delete API

● Elimina un documento dado del índice
○ La operación consiste en un borrado lógico. Cuando Elasticsearch lo
determina, procede a borrar los datos físicamente del sistema.

curl -XDELETE 'localhost:9200/items/item/MLA1234'

● Respuestas:
○ 200 (CREATED): Si se borró el documento

○ 404 (NOT_FOUND): Si no se encontró el documento

Curso de Capacitación - Julio 2014
Eliminando datos: Delete API

Ejecución distribuida:

1. Se genera el request NODO 1 NODO 2
3.
Shard 1 Shard 1
2. El server lee el valor de (primario) (replica)
routing (por defecto el
_id) y determina en qué Shard 0 Shard 0
shard primario (Shard 1) (replica)
2. (primario)
se encuenta el documento

3. Una vez borrado el
documento en el shard 1.
primario, se propaga la $curl -XDELETE
Cliente
operación en las réplicas ...

Curso de Capacitación - Julio 2014
Versionado de documentos

Implementando Optimistic Locking...

● Todo documento está versionado
○ Se utiliza para controlar la concurrencia de forma "optimista",
permitiendo ejecutar de forma transaccional las operaciones
○ Ejemplo: read-then-write o write-then-read.

● La versión se asigna al crearse un documento (_version)
○ Por defecto tiene un valor '1' pero puede definirse explícitamente.
○ Por ejemplo si dicho valor viniese desde una base de datos.

● Cada operación de escritura incrementa el valor en 1.
○ Incluye PUT, POST, DELETE

Curso de Capacitación - Julio 2014
Versionado de documentos

● Todas las escrituras retornan una nueva versión
○ La versión del documento luego de ser modificado

● Toda escritura puede recibir una versión
○ Esta es la versión sobre la cual se espera operar.
○ Si este valor no es igual a la versión actual del documento, la
operación falla.

curl -XPUT 'localhost:9200/items/item/MLB2?version=1'

curl -XDELETE 'localhost:9200/items/item/MLB2?version=1'

Curso de Capacitación - Julio 2014
Otras operaciones: Update

● Es posible actualizar solo una parte de un documento
○ Internamente ejecuta un get-and-put (reduce el tráfico entre nodos).
○ Reintenta si hubo un conflicto de versiones entre el GET y el PUT.

curl -XPUT 'localhost:9200/items/item/MLA2/_update' -d {
"doc": {
"title": "Dolar blue",
"price": 13.45
}
}

● Los campos que no son objetos se sobreescriben
● Los campos de tipo objeto se mergean recursivamente

Curso de Capacitación - Julio 2014
Otras operaciones: Multi-get

● Se pueden obtener N documentos juntos por ID
○ Esto evita múltiples rountrips al server
○ Puede hacerse a cualquier nivel (base, índice, tipo)

curl -XPUT 'localhost:9200/documentos/_mget' -d {
"docs": {
{
"_type": "Item",
"_id": "MLA1234"
},{
"_type": "Question",
"_id": 35246
}
}
}

Curso de Capacitación - Julio 2014
Otras operaciones: Bulk

● Permite realizar múltiples operaciones en un solo request
○ Esto evita múltiples rountrips al server
○ El cluster conoce a qué shards debe acceder en casa operación.
○ El end-point REST es /_bulk

Operación a realizar

{ "delete" : { "_index" : "items", "_type" : "item", "_id" : "MLA1" } }\n
{ "index" : { "_index" : "items", "_type" : "item", "_id" : "MLA2" } }\n
{ "id" : "MLA2", "title" : "La pierna izquierda de Messi" , price: 100000}\n
.
.
{ "create" : { "_index" : "items", "_type" : "item", "_id" : "MLA3" } }\n
{ "id" : "MLA3", "title" : "La mano izquierda de Ginobili", price: 20000 }\n

Cuerpo del documento Todas las líneas deben terminar
(opcional) en un "retorno de carro"

Curso de Capacitación - Julio 2014
Otras operaciones: Bulk

Formato de respuesta:
● Contiene una respuesta individual para cada operación.
● Se garantiza el orden entre operaciones y respuestas
○ la respuesta de la 3era operación está en 3er lugar
● Si falla una operación, 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".

¡es mucho más rápido que request individuales!

Curso de Capacitación - Julio 2014
Search API
(Búsquedas básicas)

Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API

Hasta ahora no dijimos nada de búsquedas en ES....

● Elasticsearch provee una API muy poderosa para todo lo
que es el proceso de búsqueda: Search API

● Permite realizar desde simples búsquedas de texto hasta
implementar muchas de las funcionalidades que proveen
los grandes buscadores (Google, Mercadolibre... :¬)

...¿y qué funcionalidades son esas?

Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API

Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API

Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API

Algunas funcionalidades importantes:

● Relevancia (Scoring)
○ Define qué tan importante es un documento en un conjunto de resultados
● Spellchecker
○ Permite interpretar una búsqueda aunque tenga errores ortográficos
● Soporte multi-lenguaje
○ Permite interpretar búsquedas en diferentes idiomas
● Autocomplete
○ Predice la búsqueda en base a las primeras palabras ingresadas y ofrece
posibles alternativas comunes.

...y todo de manera eficiente, por supuesto

Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API

● Ejecutando una búsqueda simple (todo los campos):

curl -XGET 'localhost:9200/items/_search?q=sony'

● 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
},
...
}

Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API

● Cuerpo de la respuesta:

total de resultados "hits":{
"total":1,
"max_score":0.3125,
"hits":[
los resultados de la {
primer "página" "_index":"items",
"_type":"item",
"_id":"MLA123",
"_score":0.3125,
fuente del "_source":{
documento "id":"MLA123",
"title":"Cámara Sony HD"
}
}
]

Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API

Ejecución distribuida:

1. Se genera el request NODO 1 NODO 2

Shard 1 Shard 1
2. El server determina en (primario) (replica)
qué shards (primario o
réplica) se encuentran los Shard 0 2. Shard 0
(replica) (primario)
documentos (search)

3. Finalmente reunen los 3.
datos de los shards
1.
correspondientes (reduce)
Cliente

Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API

También permite búsquedas complejas
● Búsquedas booleanas
curl -XGET 'localhost:9200/items/_search?q=sony+OR+nikon'

● Búsquedas por rango
curl -XGET 'localhost:9200/items/_search?q=price:[10+TO+*]'

● ...y mas (búsquedas difusas, expansión de frases, filtros, etc)

¿pero queremos todo en una línea?

Curso de Capacitación - Julio 2014
Search+Routing
(Ruteando datos)

Curso de Capacitación - Julio 2014
Redireccionando datos: Routing

● Por defecto, los documentos se distribuyen
uniformemente entre todos los shards.
● Luego las búsquedas se ejecutan en todos los shards
relevantes (y posiblemente nodos).
Index

Shard 1 Shard 2 Shard 3

Shard 4 ... Shard N

Cliente

curl -XGET localhost:9200/users/user/_search -d '{...}'

Curso de Capacitación - Julio 2014
Redireccionando datos: Routing

● Al indexar podemos indicar un valor de _routing el cual
determina a qué shard acceder directamente.

Index

Shard 1 Shard 2 Shard 3

Shard 4 ... Shard N

Cliente

curl -XPUT localhost:9200/users/user/1?routing=MLB -d '{...}'

Curso de Capacitación - Julio 2014
Redireccionando datos: Routing

● Al buscar, si aplicamos routing accedemos sólo a él shard
(primario o réplica) que contiene la información relevante

Index

Shard 1 Shard 2 Shard 3

Shard 4 ... Shard N

Cliente

curl -XGET localhost:9200/users/user/_search?routing=MLB -d '{...}'

Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API

● Esto mejora notablemente la performance de las
búsquedas e indexaciones.

Curso de Capacitación - Julio 2014
Query DSL
(Búsquedas complejas)

Curso de Capacitación - Julio 2014
Búsquedas complejas: Query DSL

● Permite la creación de Queries complejas.

● Se basa en la composición de queries.

Curso de Capacitación - Julio 2014
Búsquedas complejas: Query DSL

Formato: {
"query": {
"filtered": {
Queries "query": {
"match": {"title":"iphone 4s"}
Filtros },
"filter": {
"term": {"status": "active"}
}
}
}
}

Curso de Capacitación - Julio 2014
Búsquedas complejas: Match Query

Es él término utilizado para la búsqueda de texto

{
“match” : {“titulo” : “Star Wars 25”}
}

● Maneja correctamente los tipos de datos (número, boolean, etc) y el
análisis de strings, si se requiere (lo veremos más adelante)

Curso de Capacitación - Julio 2014
Búsquedas complejas: Match Query

Porcentaje mínimo de "matcheo"
● Cada token es "concatenado" por una bool query

{
“match” : {
“text” : {
“type” : “boolean”,
“query” : “lannister saludos”,
“min_should_match” : “30%”
}
}
}

Curso de Capacitación - Julio 2014
Búsquedas complejas: Match Query

Buscando frases...
● Búsquedas de frases dentro de un string

● Parámetro opcional: slop

○ Cantidad de palabras entre dos términos que e

permiten no matchear
{
“match” : {
“text” : {
“type” : “phrase”,
“query” : “Argentina salió campeón”,
“slop” : “1”
}
}
}

Curso de Capacitación - Julio 2014
Búsquedas complejas: Match Query

Buscando frases por prefijo
● Igual a búsqueda por frase pero utilizando prefijos para
el último término.
● Parámetro opcional: max_expansion
○ Especifica cantidad de términos a expandir.

{
“match” : {
“text” : {
“type” : “phrase_prefix”,
“query” : “Argentina salió”,
"max_expansion" : 100
}
}
}

Curso de Capacitación - Julio 2014
Búsquedas complejas: Match Query

Permite buscar en varios campos
● Admite expresiones regulares en los nombres de campos

{
"multi_match" : {
"fields" : ["titulo","descripcion","atributo.*"],
"query" : “Item de testeo”,
}
}

Curso de Capacitación - Julio 2014
Búsquedas complejas: Bool Query

Implementa operaciones booleanas entre resultados.

● Compone queries y es compuesta a su vez
● Tipos
○ should, must y must_not
● Parámetros opcionales
○ minimun_shoud_match
○ disable_coord

Curso de Capacitación - Julio 2014
Búsquedas complejas: Bool Query

{
"bool" : {
"must" : [
{"match" : {"tipo" : "cerveza"}},
{"match" : {"tamaño" : 250}}
],
"must_not" : [
{"match" : {"marca" : "quilmes"}}
]
}
}

Curso de Capacitación - Julio 2014
Búsquedas complejas: Range Query

● Búsquedas por rangos {
"range" : {
○ Númericos / Fechas
"precio" : {
○ Strings (por orden lexicográfico) "gte": 100,
● Parámetros "lt": 150
}
○ gt (mayor) / gte (mayor o igual)
}
○ lt (menor) / lte (menor o igual) }

Curso de Capacitación - Julio 2014
Búsquedas complejas: Match_all Query

Devuelve todos los documentos
● Generalmente en combinación con otros filtros

{
"match_all" : { }
}

Curso de Capacitación - Julio 2014
Búsquedas complejas: otras queries

● Term query
○ Búsqueda sobre campo sin parsear

○ Similar match, debe usarse este último

● Prefix/Wildcard query
○ Búsqueda parcial sobre campo sin parsear

● Fuzzy query
○ Búsqueda difusa sobre campo sin parsear

○ Bastante lento y consume muchos recursos

● Regexp query
○ Poco performante

Curso de Capacitación - Julio 2014
Query Filters
(Optimizando búsquedas)

Curso de Capacitación - Julio 2014
Búsquedas complejas: Filtros

● Varios tipos
○ term,bool,and,or,not,range,geo_distance,...
● Pueden usarse en
○ filtered query
○ constant_score query
○ aggregations
● ¡Cacheable! (super rápido)

Curso de Capacitación - Julio 2014
Queries vs Filters

Queries Filters
Búsquedas por texto y términos Sólo términos (responde a la
pregunta si/no)
Con relevancias Sin relevancia
Rápido (según query) Muy Rápido
Sin caching Cacheable

Siempre debería usarse "Filters" excepto cuando
se precisa relevancia.

Curso de Capacitación - Julio 2014
Queries vs Filters

"filtered":{
"query":{ ...query de búsqueda... },

"filter":{
Composición de
"and":[
{"term": {"listing":"silver"}},
query y filters...
{"term": {"seller": 76060303}}
]
}
}

Curso de Capacitación - Julio 2014
Ordenamiento y paginado

{
"from" : 10, "size" : 30,
paginado "query" : {
"filtered" : {
"filter" : {
"term" : {
"seller_id" : "76060303"
}
}
}
},
Ordenamiento "sort" : [ {
"start_time" : {
"order" : "desc",
"missing" : "_last"
}
}]
}

Curso de Capacitación - Julio 2014
Lucene
(Muy breve introducción)

Curso de Capacitación - Julio 2014
Breve introducción a Lucene

¿En qué capítulos de la serie Game of Thrones se
menciona al personaje Jon "Snow"?

● ¡Fácil! Busco en todos los diálogos de todos los capítulos
hasta encontrar el texto buscado (Grep).

● El tiempo total es lineal a la cantidad de palabras

● La cantidad de palabras puede ser gigante.

...¿y entonces?

Curso de Capacitación - Julio 2014
Breve introducción a Lucene

¡Índices invertidos!

● Se toma palabra por palabra de todos los diálogos y se
arma un diccionario de tipo <palabra, [capítulos]>

● Se ordenan las claves alfabéticamente

● Luego para buscar basta con hacer búsqueda binaria en la
cantidad de claves (muchas menos operaciones)

Curso de Capacitación - Julio 2014
Breve introducción a Lucene

Índices invertidos:

Términos Frecuencia Documentos (ids)

Rob 3 1,2,3

John 1 5

Arya 2 1,4

Ned 1 3

● Implementa una estructura muy eficiente.
● Permite definir relevancia en base a la frecuencia
de aparición de un término (entre e intra docs.)

Curso de Capacitación - Julio 2014
Breve introducción a Lucene

Apache Lucene implementa estos índices.

"Apache Lucene is a free/open source information
retrieval software library"

● Cada shard de Elasticsearch es una instancia de Lucene
● Por tanto un índice invertido de los datos indexados
● Es ésta librería la que provee las funcionalidades de
análisis y búsqueda de texto libre que ya veremos.

Curso de Capacitación - Julio 2014
Analyzers
(Análisis y procesamiento de texto)

Curso de Capacitación - Julio 2014
Análisis de texto: Analyzers

¿Qué hace Google con mi texto de búsqueda?

● No todo lo que buscamos se usa en los resultados.
○ "Haciendo un buscador" busca "haciendo" y "buscador" (sin "un")

● Ni todo es igual de importante
○ "Elasticsearch, el mejor de todos" prioriza "Elasticsearch" y "mejor"

● Ni tienen que ser las mismas palabras las que se buscan.
○ "Haciendo un buscador" puede buscar "hacer" y "buscador"

...para determinar qué se busca y qué no
existen diversas técnicas

Curso de Capacitación - Julio 2014
Análisis de texto: Analyzers

Curso de Capacitación - Julio 2014
Análisis de texto: Analyzers

Curso de Capacitación - Julio 2014
Análisis de texto: Analyzers

Técnicas generales de procesamiento de texto:

● Tokenizing
○ Dividir el texto en términos significativos ("la casa" => ["la", "casa"])
● Stopwords
○ Ignorar los términos comunes de cada lenguaje (Ej: artículos)
● Ignorar 'capitalización'
○ No diferenciar mayúsculas de minúsculas.
● Ignorar caracteres especiales
○ No diferenciar caracteres especiales de su versión original (Ej: ã => a)
● Stemming
○ Transformar una palabra a su "raíz" (Ej: jugando => jugar).
● Sinónimos
○ Incluir en una búsqueda a los sinónimos (Ej: triunfar => ganar).

Curso de Capacitación - Julio 2014
Análisis de texto: Analyzers

"A la grande le puse Cúca"

Tokenizing

A la grande le puse Cúca

ignore-case filters

a la grande le puse cúca

stopwords filters

grande puse cúca

ignore special chars filters

grande puse cuca

Curso de Capacitación - Julio 2014
Análisis con ES: anatomía de un Analyzer

Un Analyzer está compuesto de:

● Tokenizer
○ Divide el texto en términos (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 modificándolo 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.

...Elasticsearch provee tokenizers prearmados y
permite generar nuevos personalizados

Curso de Capacitación - Julio 2014
Análisis con ES: anatomía de un Analyzer

● Análisis en la indexación:

Texto Tokenizer Filter
Filter
Filter
Tokens Index
entrada salida

● Análisis en la búsqueda:

query query
Tokenizer Filter
Filter
Filter Search
"match":"la ola" "match":"ola"

Curso de Capacitación - Julio 2014
Análisis con ES: anatomía de un Analyzer

● Tokenizers: "Masche te quita-lo-bailado"

Tokenizer Descripción Ejemplo

keyword genera un solo token "Masche te quita-lo-bailado"

whitespace separa por espacios [“Masche”, “te”,”quita-lo-bailado”]

standard basado en gramática [“Masche”, “te”,”quita”, “lo”,
“bailado”]

URL / email diferencia urls y emails ["Mail", "elastic@girl.com"]

Custom plug-in ...

Curso de Capacitación - Julio 2014
Análisis con ES: anatomía de un Analyzer

● Filters: "Elástico"

Filter Descripción Ejemplo

lowercase Ignora capitalización "elástico"

asciifolding reemplaza caracteres especiales "Elastico"

NGrams Genera N-Gramas del token. ["El", "la", "as", "st"...]
Útil para mutilenguaje y
autcomplete. (ej: n=2)

stemmer / Filtros algorítmicos. Especializados ["elastico"," elast"]
snowball en un lenguaje

hspell stemming basado en diccionarios ["elastico"," elastica"]

Curso de Capacitación - Julio 2014
Agenda
Día 1 Día 2
● Introducción ● Mapping
● Capa distribuida ● Relevancia (Scoring)
● E/S de datos ● Aggregations
● Búsquedas básicas ● Integración
● Lucene ● Puesta en Producción
● Búsquedas avanzadas ● Funcionalidades
● Analyzers avanzadas

Curso de Capacitación - Julio 2014
Mapping
(Configurando los tipos de datos)

Curso de Capacitación - Julio 2014
Mapping: ¿Qué es?

● Los datos indexados son obtenidos de documentos y campos

● El mapeo define como serán manipulados esos documentos
○ ¿Cómo deben ser indexados?
○ ¿Cuáles son los tipos de datos de los campos?
○ ¿Cómo manejar los tipos de datos objeto?
○ ¿Qué relación hay entre los diferentes tipos de documentos?
○ ¿Cómo manipular la metadata?
○ Definir la relevancia de los campos / documentos

Curso de Capacitación - Julio 2014
Mapping: mapeo dinámico

Es el mapeo que Elasticsearch aplica por defecto

● Principio de "Schema-less"
○ Sólo configurar cuando es necesario

● Tipos de datos
○ Los infiere de los tipos de datos básicos de JSON (boolean, string, etc.)

Curso de Capacitación - Julio 2014
Mapping: configuración

¿Cuando debería definir un mapeo?

● Tipos de datos que lo requieren (no-nativos de Json)
○ Fechas
○ Geolocalización
● Boosting
○ Cuando deseo realizar boosting de un documento / campo
● Análisis de texto
○ Búsquedas específicas
○ Adaptaciones de idioma
● Funcionalidades que lo requieren
○ Aggregations (Facets)
○ Highlighting

Curso de Capacitación - Julio 2014
Mapping: configuración

Los mapeos pueden definirse de dos formas:
● En la creación del indice...

$curl -XPOST localhost:9200/test -d '{
"settings" : { … },
"mappings" : {
"item" : {
"properties" : {
"listing_type" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
}
}'

Curso de Capacitación - Julio 2014
Mapping: configuración

Los mapeos pueden definirse de dos formas:
● Mediante PUT a API de Mapping

$ curl -XPUT 'http://localhost:9200/users/item/_mapping' -d '
{
"item" : {
"properties" : {
"listing_type" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
}'

Cuidado: los cambios en un mapping existente no se aplican hacia atrás

Curso de Capacitación - Julio 2014
Mapping: configuración

● Tipos de datos (pueden ser de un único tipo o array)
Tipo Descripción

string, integer, long, float, double, Los clásicos...
date, boolean

root-object / object Objeto padre

nested Similar a object, difiere en la forma que se
almacena internamente

multi_field Permite configurar un campo de múltiples tipos

ip Dirección ipv4

geo_point Representa un punto de geo localización (lat,long)

attachment Archivo binario parseable

Curso de Capacitación - Julio 2014
Mapping: configuración

● Parametros extras

Tipo Descripción

boost Grado de relevancia

include_in_all Si el campo será incluido en el campo _all

null_value Valor por defecto del campo

store Si el valor del campo será almacenado (además del
indexado)

index_name Nombre con el que será indexado el campo

Curso de Capacitación - Julio 2014
Mapping: campos de tipo texto

● Utilizar Strings como tipo de dato para campos de texto

Tipo Descripción

index Define si el campo será buscable:
● analyzed: buscable y analizado
● not_analyzed: buscable, pero no analizado
● no: No buscable

analyzer, search_analyzer, Define analyzer a utilizarse al buscar/indexar
index_analyzer

Curso de Capacitación - Julio 2014
Mapping: campos de tipo numérico

● Puede ser float, double, integer, long, short o byte

Tipo Descripción

ignore_malformed Ignora mal formateados. Por defecto en "false"

Curso de Capacitación - Julio 2014
Mapping: campos de tipo fecha

● Representados por Strings con formato específico

Tipo Descripción

Define el formato de la fecha. Existen varios predefinidos
format (por defecto ISO8601) pero tambien soporta
personalizados

ignore_malformed Ignora mal formateados. Por defecto en "false"

Curso de Capacitación - Julio 2014
Mapeos: Campos de tipo objeto

● Permite crear campos de tipos de datos compuestos

Tipo Descripción

Atributo(s) del objeto, puede ser del tipo "core" o a su vez
properties
otro objeto

Por defecto en "true". Permite agregar dinámicamente
dynamic
nuevos atributos al objeto (principio de "schema-less")

enabled Ignora el campo (no se indexa)

path Especifica cómo se guardará (y se accederá) el documento.

include_in_all Los atributos heredan la configuración de este objeto

Curso de Capacitación - Julio 2014
Mapping: campos de tipo objeto

{
"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"}
}
}
}

Curso de Capacitación - Julio 2014
Mapping: Multi-fields

Permite indexar un mismo campo de diferentes formas

● Generalmente utilizado para parsear un mismo campo
"string" con diferentes analyzers

● Útil para realizar facetado / clasificación diferenciandolo
de las queries comunes

● También para soporte multi-lenguaje
○ Permite aplicar analyzers específicos para distintos lenguajes.

Curso de Capacitación - Julio 2014
Mapping: Multi-fields

"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" }
}
}
}
}

Curso de Capacitación - Julio 2014
Scoring
(Dando relevancia a los resultados)

Curso de Capacitación - Julio 2014
Scoring: introducción

¿Qué tan importante es dar relevancia a los
resultados de las búsquedas?...

Curso de Capacitación - Julio 2014
Scoring: introducción

...básicamente determina qué queremos mostrar primero
a los usuarios, en base a sus preferencias...

Curso de Capacitación - Julio 2014
Scoring: introducción

... o las nuestras

Curso de Capacitación - Julio 2014
Scoring: introducción

¿Cómo se determina la posición de un resultado?

● Algoritmos
○ Procesan información de la frecuencia de aparición de los términos
buscados en los documentos encontrados.

● Boosting
○ Operación 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.

Curso de Capacitación - Julio 2014
Scoring: algoritmos

● Term Frequency (TF)
○ Frecuencia de aparición de un término (token) en un documento.
○ Mayor frecuencia => mayor relevancia

● Inverted Document Frequency (IDF)
○ Frecuencia de aparición de un término en toda la colección de docs.
○ Mayor frecuencia => menor relevancia.

● Algoritmo TF-IDF
○ Por cada término se calcula el TF. Luego este valor se pondera con la
relevancia IDF.

...veamos como lo implementa Elasticsearch

Curso de Capacitación - Julio 2014
Scoring: algoritmos

Lucene Similarity:
"hits":{
● Algoritmo implementado por "total":1,
Lucene para scoring. "max_score":0.3125,
"hits":[
{
● Implementación de TF-IDF. "_index":"items",
"_type":"item",
● Incorpora normalización y "_id":"MLA123",
"_score":0.3125,
boosting.
"_source":{
"id":"MLA123",
● Se ejecuta en cada búsqueda de "title":"Cámara Sony HD"
texto libre (match) }
}
]

Curso de Capacitación - Julio 2014
Scoring: Lucene Similarity

● A mayor cantidad de ocurrencias de un término en un
documento, mayor relevancia (score).

Ejemplo: buscando "API":

Documento 1: Documento 2:

"...MercadoLibre realizó su primera "...Hace mucho tiempo que se pedía
Developer Conference basadas en que MercadoLibre desarrolle una API
sus APIs donde se presentaron.... para realizar consultas a la pagina de
MercadoLibre anunció hoy que los > manera mas sencilla, a que hasta
desarrolladores de software podrán hace un tiempo solo teníamos XML y
tener acceso a las APIs..." dolor de cabeza..."

Curso de Capacitación - Julio 2014
Scoring: Lucene Similarity

● Términos poco frecuentes entre los documentos aportan
mayor peso a la relevancia total.

Ejemplo: buscando "Mercadolibre APIs Conference":

Documento 1: Documento 2: Documento N:

"...MercadoLibre realizó "...Hace mucho tiempo "...Las APIs de
su primera Developer que se pedía que MercadoLibre son
Conference donde se
> MercadoLibre ,.., una plataforma ideal
presentaron las desarrolle unas APIs para desarrollar
novedades sobre.... para realizar..." aplicaciones..."

Curso de Capacitación - Julio 2014
Scoring: Lucene Similarity

● A mayor cantidad de términos de búsqueda en un
documento, mayor relevancia.

Ejemplo: buscando "Mercadolibre API":

Documento 1: Documento 2:

"...MercadoLibre realizó su primera "...Las oportunidades ahora son
Developer Conference basadas en ilimitadas, podremos integrar
sus APIs donde se presentaron.... grandes retailers a MercadoLibre,
La empresa anunció hoy que los > desarrollar soluciones logísticas,
entre otras opciones. En definitiva,
desarrolladores de software podrán seguiremos trabajando para..."
tener acceso.."

Curso de Capacitación - Julio 2014
Scoring: Lucene Similarity

● Campos "cortos" tienen más relevancia que los "largos".

Ejemplo: buscando "Mercadolibre":

Título de Documento 1: Cuerpo de Documento 2:

"Podremos integrar grandes
"MercadoLibre realizó su retailers a MercadoLibre,
desarrollar soluciones logísticas,
primera Developer > entre otras opciones. En
Conference en San Pablo" definitiva, seguiremos trabajando
para..."

Curso de Capacitación - Julio 2014
Scoring: boosting

¿Por qué aplicar boosting?

● Si bien Lucene hace un excelente trabajo de scoring, hay
variables que estos algoritmos no contemplan.
● Los aspectos de lógica de negocio que determinan la
relevancia de un documento, requieren que ésta se
modifique mediante el boosting.
● Ejemplos de esto son:
○ distintos tipos de documentos (ej: videos, imágenes).
○ relevancia afectada por variables de dominio (ej: ventas)

Curso de Capacitación - Julio 2014
Scoring: boosting

¿Cuándo y cómo se aplica el boosting?

● En tiempo de indexación:
○ Cuando consideramos que cierto documento será siempre más
importante que otros (Ej: la home-page de un sitio).
○ Es más performante ya que no requiere cálculos extra.
○ Si se quiere modificar, requiere reindexar el documento.

● En tiempo de búsqueda (recomendado):
○ Permite variar la relevancia de un documento según variables del
dominio (ej: fecha de búsqueda vs fecha de publicación)
○ Requiere calcular el score en el momento.
○ Puede variarse con solo modificar la búsqueda.

Curso de Capacitación - Julio 2014
Scoring: boosting en indexación

● A nivel de documento utilizando _boost
curl -XPOST 'localhost:9200/users/user/dakota' -d '{
"_boost" : 5.0
...
}'

● A nivel de campo mediante mapping
curl -XPOST 'localhost:9200/users/user/_mapping -d '{
"user": {
"properties":{
"nickname": {"type":"string","boost": 2.0},
"email": {"type":"string","boost": 1.5},
...
}
}
}'

Curso de Capacitación - Julio 2014
Scoring: boosting en búsqueda

● Toda query permite modificar la relevancia de sus
resultados mediante el parámetro boost

"bool" : {
"should" : [
{
"match": {
"site": {
"query": "Alamaula"
}
}
},
{
"match": {
"site": {
"query": "Mercadolibre"
"boost": 1.5
}
}
}
]
}

Curso de Capacitación - Julio 2014
Scoring: boosting en búsqueda

● También es posible definir un cálculo de scoring
personalizado utilizando Scripts
● El lenguaje utilizado es MVEL (muy eficiente)

"custom_score": {
"query": { ...búsqueda de empleados... },
"script":
"_score * (doc['puesto'].value == 'capo'? 1.2 : 1)"
}

score calculado por Lucene atributo del documento
para la query ejecutada

Curso de Capacitación - Julio 2014
Scoring: boosting

Ejemplos de boosting: blog de reviews

Se tiene un blog de tecnología, donde se publican periódicamente reviews de
productos. Las reviews pueden ser artículos de texto (largos), con título y
contenido, o videos, con una descripción (corta) asociada.

El buscador del site debe priorizar los artículos por sobre los videos. Si un texto se
encuentra en el título de un artículo, éste es más importante que si se encontrase
en el cuerpo del mismo.

Los artículos más recientes deben ser más relevantes que otros más viejos.

Así mismo, al listarse todos los productos evaluados, se debe priorizar aquellos
sobre los cuales se hayan generado mayor cantidad de artículos y/o videos.

Curso de Capacitación - Julio 2014
Scoring: boosting

Ejemplos de boosting: blog de reviews

1. Las descripciones de los videos tendrán mayor scoring que los artículos de
texto por ser más cortas: boost a los artículos.

2. Entre los artículos, los títulos tendrán más relevancia por ser más cortos.

3. Para dar importancia a los artículos más recientes se debe verificar la fecha
de publicación: boost por script en base a "cercanía" con fecha actual.

4. Si un producto es muy referenciado entre todos los documentos baja su
relevancia: boost por cantidad de referencias.

Curso de Capacitación - Julio 2014
Scoring: custom_filters_score

● Si el boost depende de valores exactos, podemos
aprovechar la eficiencia de los filtros.

"custom_filters_score": {
"query": { ...búsqueda realizada... },
"filters": [
{
"filter": {
"term": {
"puesto": "capo"
}
},
"boost": 1.2
}
]
}

Curso de Capacitación - Julio 2014
Aggregations
(estadísticas de los resultados)

Curso de Capacitación - Julio 2014
Aggregations: introducción

¿Para qué sirve?
● Proveen contadores con resultados de las búsquedas

● Proveen información para análisis estadístico

● Guían al usuario hacia filtros más específicos

Curso de Capacitación - Julio 2014
Aggregations: introducción

Curso de Capacitación - Julio 2014
Aggregations: introducción

● Usado para realizar herramientas de análisis y dashboards

http://demo.kibana.org/

Curso de Capacitación - Julio 2014
Aggregations: introducción

2da republicación Cambio precio Upgrade a envios gratis
arrastra ventas y de 200 a 150 gold_premium
visitas Evento x día

Curso de Capacitación - Julio 2014
Aggregations: elementos

● Buckets
○ Documentos que cumplen una determinada condición
○ Equivalente a GROUP BY de SQL
○ Ej: Artículos agrupados por categoría

● Metrics
○ Funciones matemáticas aplicadas sobre los buckets
○ Equivalente en SQL: COUNT, AVG, SUM, MAX, etc
○ Ej: Precio promedio

Curso de Capacitación - Julio 2014
Aggregations: añadiendo complejidad

● Combinación de ambos
○ Un caso común es utilizar una combinación entre buckets y metrics
○ Ej: Calcular el precio promedio por categoría

● Composición de buckets
○ Es posible definir buckets dentro de buckets permitiendo agrupar por
más de un críterio
○ Ej: Calcular el precio promedio por categoría, listing type y si tiene free
shipping

Curso de Capacitación - Julio 2014
Aggregations: ejemplo

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"} }
}
}
}
}
}
}

Curso de Capacitación - Julio 2014
Aggregations: ejemplo

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}
},

}

Curso de Capacitación - Julio 2014
Aggregations: scope

● Mismo scope que la query (defecto)
○ Las aggregations se aplican sobre los resultados de la búsqueda

● Global
○ Las aggregations se aplican sobre el total los datos (no de la búsqueda)

● Filter bucket
○ Las aggregations se aplican sobre los resultados de la búsqueda + filtro
especifico dado

Curso de Capacitación - Julio 2014
Aggregations: tipos

● Term
○ Devuelve los n términos más frecuentes
● Stats
○ Información estádistica de los resultados (máximo, mínimo, media,
variancia, desviación estandard, etc)
● Percentiles
○ Genera los percentiles sobre un campo numérico 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

Curso de Capacitación - Julio 2014
Integración
(Conectando sistemas externos)

Curso de Capacitación - Julio 2014
Integración: clientes

Aparte del protocolo HTTP se pueden implementar
clientes nativos de Elasticsearch

● Se comunican mediante el protocolo propio del sistema
○ Protocolo binario vía TCP, mas eficiente que JSON/HTTP.

● "Conocen" el cluster y actúan como un nodo más.
○ No almacenan información.

... existen dos categorías de clientes

Curso de Capacitación - Julio 2014
Integración: clientes

Transport Client

● Cliente "liviano"
○ No se integra con el cluster (no se ejecuta node_discovery)
○ Se crea y destruye rápidamente. Ideal para múltiples threads
● Ejecuta requests en modo round-robin
○ Requiere que se defina una lista de nodos con los que comunicarse.
○ Si algún nodo se diese de baja, da timeout y continúa con otro.

Nodo 1 Nodo 2 Nodo 3

Nodo 4 ... Nodo N

Cliente

Curso de Capacitación - Julio 2014
Integración: clientes

Node Client

● Nodo del cluster
○ No almacena información, pero a todo efecto es un nodo más.
○ Al crearse el cluster lo reconoce y asigna un nombre (node discovery)
● Conoce tablas de ruteo y estado del cluster
○ Accede directamente a los shards que tienen la info (si se hace routing)
○ Permite ejecutar acciones ante la caída de nodos o pérdida de info.
Cluster

Nodo 1 Nodo 2 Nodo 3

Nodo 4 ... Nodo N

Cliente

Curso de Capacitación - Julio 2014
Integración: Rivers
¿Que son?
● Complementos que ejecutan pulling de información (o

reciben un push) y la indexan en el cluster.
● Automatizan las operaciones de toma de datos + bulk

Algunos ejemplos
● Wikipedia
● Twitter
● RabbitMQ
● Dropbox

Curso de Capacitación - Julio 2014
Producción
(Configuración y recomendaciones)

Curso de Capacitación - Julio 2014
Producción: instalación

● 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.

... vamos a centrarnos en el último

Curso de Capacitación - Julio 2014
Producción: instalación

● Archivos de la distribución
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

Curso de Capacitación - Julio 2014
Producción: instalación

● Directorios principales

Nombre Descripción

bin binarios de ejecución. Contiene el archivo
"elasticsearch.in.sh" donde puede definirse el
Heap.

config archivos de configuración (ES y logging)

data datos almacenados por cluster

lib librerías utilizadas, incluyendo ES.

logs Logs de la aplicación. Incluye detalle de operaciones
"lentas"

Curso de Capacitación - Julio 2014
Producción: configuración

Algunas premisas importantes sobre configuración

● No cambiar, a menos que sea necesario
○ La configuración por defecto está pensada para un buen rendimiento.
● Misma configuración para todos los nodos
○ No configurar servers por separado para uso diario.
○ Puede ser necesario para mantenimiento.
● Preferir configuración por API por sobre archivo.
○ Mantener en archivo la configuración que aplica siempre.

... ante la duda, consulte a su experto en
Elasticsearch más cercano

Curso de Capacitación - Julio 2014
Producción: configuración

● Configuración principal de un cluster/nodo

Nombre Descripción

Nombre del cluster. En base a él se unen los nodos, con
cluster.name
lo que debe ser único.

node.name Nombre del nodo. ES asigna valores por defecto

Ubicación de los datos. Configurar siempre fuera del
path.data
directorio de instalación de ES.

path.logs Ubicación de los logs (ej: /usr/local/log)

Curso de Capacitación - Julio 2014
Producción: configuración

● Sistema distribuido: detección de nodos

Nombre Descripción

discovery.zen. Mínima cantidad de Masters. Conviene definir
minimum_master_nodes N/2+1 donde N es la cantidad de masters elegibles.

discovery.zen.ping. Descubrimiento de nodos vía multicast. En
multicast.enabled producción debe estar deshabilitado (false).

Lista de posibles masters a consultar para descubrir
discovery.zen.ping.
el cluster. Basta con que uno de los nodos
unicast.hosts
pertenezca al cluster para integrarse.

Curso de Capacitación - Julio 2014
Producción: configuración

● Sistema distribuido: recupero

Nombre Descripción

Cantidad mínima de nodos necesaria para
gateway. recuperar el cluster luego de reinicio de todos los
recover_after_nodes nodos. Mayor número implica reuso de datos
locales y menor transferencias de shards

gateway. Cantidad de minutos a esperar otros nodos una vez
recover_after_time que se levantaron los N nodos anteriores.

Curso de Capacitación - Julio 2014
Producción: memoria

Definiendo el tamaño del Heap
● Definir la variable de ambiente ES_HEAP_SIZE
○ Define el tamaño máximo y mínimo (iguales) de la memoria reservada
para ejecutar Elasticsearch.
● Idealmente definirla como 1/2 de la memoria total.
○ La otra mitad también es aprovechada por ES, ya que se utiliza para
cache del filesystem
● Nunca reservar más de 30GB de espacio
○ La JVM realiza compresión de punteros (64 a 32 bits)
● Definir configuraciones extra para evitar swapping
○ Ver comentarios en elasticsearch.yml

Curso de Capacitación - Julio 2014
Producción: memoria

Principales "usuarios" de la memoria

● 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 sólo cuando hay muchos shards ejecutando en un mismo nodo.

Curso de Capacitación - Julio 2014
Producción: memoria

En caso de una OutOfMemoryException

● Surge cuando la JVM no tiene más memoria disponible
● Puede generar inestabilidad en el clusters
○ Las APIs de monitoreo pueden no informar problemas.
○ Algunas operaciones pueden seguir ejecutándose normalmente.

● Es necesario tomar medidas
○ Ver logs. Elasticsearch informa cuando ocurrió un error de este tipo.
○ Ampliar memoria (siempre bajo las recomendaciones previas).
○ Agregar nodos.

Curso de Capacitación - Julio 2014
Producción: file descriptors

Cantidad de descriptores de archivos (y sockets)
abiertos por el proceso, permitidos por el SO

● Puede ser necesario aumentar este valor.
○ El valor por defecto de los SO's suele ser muy bajo.
● Setear en 64K, o 32K si está restringido.
○ Las instancias del Melicloud ya vienen con un número elevado.
● Para monitorear este valor:
curl 'localhost:9200/_nodes/process?pretty'

Curso de Capacitación - Julio 2014
Producción: dimensionamiento

¿Cómo dimensionar un cluster?

● No hay recetas mágicas.
○ Cada instalación es diferente.
○ Depende de la infraestructura, los datos y las queries.

● Es posible determinar el máximo tamaño de un shard
a. Comenzar con 1 nodo y 1 shard (sin réplicas).
b. Indexar información y mirar métricas.
c. Cuando el nodo está sobrecargado (aumento de tiempos, GC, etc),
obtener la cantidad total de documentos indexados.
d. Asumir el 50~60% de esa cantidad como capacidad del nodo.

Curso de Capacitación - Julio 2014
Producción: configuraciones extras

Algunos tips importantes a tener en cuenta

● Deshabilitar creación de índices automática.
○ Obliga a que todo índice sea creado vía la API correspondiente
○ Setear action.auto_create_index en false
● Deshabilitar borrado de índices masivo.
○ Evita que pueda ejecutarse un DELETE sobre la raíz de índices.
○ Setear action.disable_delete_all_indices en true
● Deshabilitar sharding reallocation al reiniciar cluster
○ cluster.routing.allocation.disable_allocation
○ cluster.routing.allocation.disable_replica_allocation

Curso de Capacitación - Julio 2014
Producción: hardware

¿Qué infraestructura se recomienda?

● Nodos "large" o "medium" sobre "small"
○ Preferible tener menos nodos más potentes que muchos poco potentes
● Toda la memoria que sea posible
○ En especial si se hace uso intensivo de facetado y ordenamiento
○ La memoria que no use ES, será aprovechada por el file system cache
○ Los filtros también podrán cachear más documentos.
● CPU y Cores: Más es mejor.
○ Una instancia utiliza concurrencia intensivamente
○ Puede ocupar todos los cores disponibles.
○ Mayor velocidad de CPU ayuda a indexación y búsqueda.

Curso de Capacitación - Julio 2014
Producción: monitoreo

Todo en ES puede monitorearse vía APIs...
... ¡y debe monitorearse!

● Cluster Health:
○ Semáforo indicador del estado del cluster
○ Verde: los shards primarios y las réplicas están inicializadas.
○ Amarillo: todos los shards primarios están iniciados pero faltan réplicas.
○ Rojo: faltan shards primarios y réplicas (falta información)
● Cluster Info/Stats:
○ Info: información estática del cluster que no varía.
○ Stats: información del cluster que varía con el tiempo.
○ Cubren todos los aspectos de SO, JVM, Red, etc.

...existen plugins para todas estas APIs

Curso de Capacitación - Julio 2014
Producción: monitoreo

Los plugins más recomendados:

● BigDesk
○ Permite monitorear todos los aspectos de ejecución de cada nodo.
● Elasticsearch-Head
○ Permite visualizar la topología y el comportamiento de los shards.
○ Permite navegar la información y generar queries libres o prearmadas.
● Paramedic:
○ Monitor de ejecución de todo el cluster en una sola pantalla.
● Elasticsearch HQ
○ Monitor y administrador del sistema (excelente interfaz)

... y hay muchos más en el site

Curso de Capacitación - Julio 2014
Producción: monitoreo

¿Y si quiero/necesito usar curl? ¡CAT API!

curl -XGET localhost:9200/_cat/master
3oPXD3WEQJulGc4OYkGZeQ mac-host 10.10.32.237 The Angel

curl -XGET localhost:9200/_cat/indices?h=h,i,p,dc,fm,ss
yellow brasil_2014 5 20 0b 102.7kb

curl -XGET localhost:9200/_cat/
=^.^=
/_cat/allocation
/_cat/shards
...

Curso de Capacitación - Julio 2014
Bonus Track
(algunas funcionalidades avanzadas)

Curso de Capacitación - Julio 2014
Bonus Track: percolation

Búscando búsquedas... ¿lo qué?

● En lugar de indexar documentos y buscarlos con queries...
● ... almacenamos queries y las "filtramos" con documentos.

curl -XPUT localhost:9200/users/.percolator/usuario-trucho -d '{
"query" : {
"boolean" : {
"must" : [
{ "term" : { "reputation" : "5_red" }},
{ "range" : { "negative_calif" : { "gt" : "3" }}}
]
}
}
}'

Curso de Capacitación - Julio 2014
Bonus Track: percolation
Luego percolamos los documentos
● Sin indexarlos

curl -X POST localhost:9200/user/user/_percolate -d '{
"doc": {"reputation" : "5_red","negative_calif" : 23}
}'

● Al indexarlos
curl -X POST localhost:9200/user/user/?percolate=* -d '{
"reputation" : "5_red","negative_calif" : 23
}'

● Resultado
{ "ok" : true, "matches" : ["usuario-trucho"]}

Curso de Capacitación - Julio 2014
Bonus Track: snapshots

Desde ES 1.x es posible salvar el estado del cluster

● Primero se crea un repositorio indicando el tipo.
tipo de repositorio

curl -XPUT 'localhost:9200/_snapshot/fs_backup' -d '{
"type" : "fs",
"settings": {
"location": "/es/backups",
}
}'

nombre del repo

Curso de Capacitación - Julio 2014
Bonus Track: snapshots

● Luego se genera el snapshot (x def. para todos los índices)

curl -XPUT localhost:9200/_snapshot/fs_backup/2014 -d '{
"indices": "indice_1, indice_n"
}'

● Y luego se recupera cuando es necesario (previo cierre)

curl -XPOST "localhost:9200/_snapshot/fs_backup/2014" -d '{
"indices": "indice_*"
}'

Curso de Capacitación - Julio 2014
Bonus Track: geo locations

Elasticsearch permite buscar zonas geográficas

● Una vez seteado el mapping correcto, indexamos la info

curl -XPUT 'localhost:9200/restaurant/desc/1' -d '{
"desc" : {
"location" : { "lat" : 41.12, "lon" : -71.34 }
}
}'

se admiten varios formatos
(ej: "lat,long")

Curso de Capacitación - Julio 2014
Bonus Track: geo locations

● Búsqueda por geo_box (región rectangular)
geo_bbox" : {
"location" : {
"top_left" : { "lat" : 40.73, "lon" : -74.1 },
"bottom_right" : { "lat" : 40.717, "lon" : -73.99 }
}
}

● Por geo_distance (región circular)

"geo_distance" : {
"distance" : "400km"
"location" : { "lat" : 40.73, "lon" : -74.1 }
}

Curso de Capacitación - Julio 2014
Bonus Track: scan

● Para iterar sobre una gran cantidad de resultados
● Permite generar un "cursor" sobre una búsqueda
○ Permite definir el tiempo en que permanece abierto
○ Y la cantidad de registros por scan a obtener
● Luego ES genera un token para cada Scan iniciado.

curl -XGET 'localhost:9200/_search?search_type=scan&scroll=10m&size=50' -d '{
"query" : { "match_all" : {}}
}'

curl -XGET 'localhost:9200/scroll?scroll=10m' -d
'c2NhbjsxOjBLMzdpWEtqU2IyZHlmVURPeFJOZnc7MzowSzM3aVhLalNiMmR5ZlVET3hSTmZ3OzU
6MEszN2lYS2pTYjJkeWZVRE94Uk5mdzsyOjBLMzdpWEtqU2IyZHlmVURPeFJOZnc7NDowSzM3aVh
LalNiMmR5ZlVET3hSTmZ3Ow=='

Curso de Capacitación - Julio 2014
¿?

Curso de Capacitación - Julio 2014
Recursos

Algunas páginas interesantes:

● 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 producción)
○ 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 español
○ https://groups.google.com/forum/#!forum/elasticsearch-es

Curso de Capacitación - Julio 2014