curso completo de elasticsearch
TRANSCRIPT
ElasticsearchImplementando 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
● 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
Objetivos
● Introducción● Capa distribuida● E/S de datos● Búsquedas básicas● Lucene● Búsquedas avanzadas● Analyzers
● Mapping● Relevancia (Scoring)● Aggregations● Integración● Puesta en Producción● Funcionalidades
avanzadas
Curso de Capacitación - Julio 2014
AgendaDía 1 Día 2
BúsquedasLas búsquedas son la principal interfaz para la obtención de información en la actualidad.
Curso de Capacitación - Julio 2014
Curso de Capacitación - Julio 2014
Búsquedas: Motores conocidos
Búsquedas: Motores conocidos
Curso de Capacitación - Julio 2014
Búsquedas: Motores conocidos
Curso de Capacitación - Julio 2014
Búsquedas: Motores conocidos
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: desafíos
?
?
Existen muchos productos y herramientas para implementar búsquedas de texto...
Curso de Capacitación - Julio 2014
Búsquedas: herramientas
● 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
● 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
Breve reseña histórica
● 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
¿Qué características tiene?
● 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
¿Y qué puede hacer?
# 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
Una muestra gratis :¬)
Curso de Capacitación - Julio 2014
Todo muy lindo pero.. ¿quién lo usa?
● 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.
Curso de Capacitación - Julio 2014
Componentes principales
Elasticsearch se compone de dos capas principales bien definidas y desacopladas:
... veamos como funciona la primera
Sistemadistribuido
Curso de Capacitación - Julio 2014
¿Qué esperamos en Meli de un sistema distribuido?
● Performance
● Escalabilidad
● Alta disponibilidad
● Tolerancia a fallos
Curso de Capacitación - Julio 2014
Sistema distribuido: introducción
Curso de Capacitación - Julio 2014
Sistema distribuido: glosario
Cluster Nodos Indices Tipos
Conjunto de instancias de ES que comparten mismo nombre (cluster.name)
Instancia de Elasticsearch
Colección de varios
documentos
(objeto JSON), no
necesariamente de
igual estructura.
Comparable a
esquemas de bases
de datos
No confundir con
índices de bases de
datos
Colección de varios
documentos de
similar estructura
Comparable a
tablas de bases de
datos
Curso de Capacitación - Julio 2014
Sistema distribuido: Ejemplo
Cluster: springfieldIndice: usuarioTipo: preguntas
NODO 1NODO ES
USUARIOpreguntas
{...}compras
{...}
USUARIO
Preguntas
Compras
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
NODO 1Usuario
homero
homero
lisa
moe
bart
bart
bart
bart
Pregunta
p1
p2
p3
p4
p5
p6
p7
p8
1 shardNODO 1Usuario
homero
homero
lisa
moe
Pregunta
p1
p2
p3
p4
2 shards
Usuario
bart
bart
bart
bart
Pregunta
p5
p6
p7
p8
NODO 2
Shard 1(primario)
Shard 0(replica)
NODO 1
Shard 0(primario)
Shard 1(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
Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas
Agregando un nodo...
NODO 2
Shard 1(primario)
Shard 0(replica)
NODO 1
Shard 0(primario)
Shard 1(replica)
NODO 3
NODO 2
Shard 1(primario)
Shard 0(replica)
NODO 1
Shard 0(primario)
Shard 1(replica)
NODO 3
Shard 0(replica)
Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas
...se balancea el cluster automáticamente.
NODO 2
Shard 1(primario)
NODO 1
Shard 0(primario)
Shard 1(replica)
NODO 3
Shard 0(replica)
Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas
...se balancea el cluster automáticamente.
Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas
Ante la caida de un nodo...
NODO 2
Shard 1(primario)
NODO 1
Shard 0(primario)
Shard 1(replica)
NODO 3
Shard 0(replica)
NODO 1
Curso de Capacitación - Julio 2014
Sistema distribuido: shards y réplicas
... se regeneran los shard faltantes
NODO 2
Shard 1(primario)
Shard 0(primario)
NODO 3
Shard 0(replica)
Shard 1(replica)
NODO 2NODO 1
Vamos a experimentar un poco con los shards...
Curso de Capacitación - Julio 2014
Sistema distribuido: simulación
Data In / Out
Curso de Capacitación - Julio 2014
{
"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",
}
● Los documentos se representan en formato JSON
● Cada campo contiene información de cierto tipo.
Curso de Capacitación - Julio 2014
Estructura de datos
● ES agrega su propia Metadata a los documentos
Campo
_id
_type
_source
_all
_timestamp
_ttl
_size
Default
enabled
enabled
disabled
disabled
disabled
Descripción
ID interno del documento
Tipo de documento
Guarda el doc original indexado
Indexa todos los valores de todos los campos
del documento.
timestamp asociado al documento
define una fecha de expiración (opcional)
almacena el tamaño del _source
descomprimido
Curso de Capacitación - Julio 2014
Estructura de datos
● 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
ES soporta los tipos de datos propios de JSON y otros tipos derivados, propios del sistema:
Curso de Capacitación - Julio 2014
Tipos de datos
Primero necesitamos un índice...
curl -XPUT ‘localhost:9200/items’ -d '{
"settings" : {
...
},
"mappings" : {
...
}
}'
... aunque si no lo creamos, ES lo hace por nosotros usando
una configuración por defecto.
Nombre del índice
Configuraciones opcionales
Curso de Capacitación - Julio 2014
Insertando datos: Index API
Luego agregamos la información...
curl -XPUT 'localhost:9200/items/item/MLA123' -d '{
"id" : "MLA-123"
"title": "Delorean modelo '85, joya nunca taxi",
"kmts" : 325000
"seller": "MACFLY_1980"
}'
nombretipooperación
HTTP RESTnombreíndice ID documento
documento JSON a indexar
Curso de Capacitación - Julio 2014
Insertando datos: Index API
Podemos dejar que ES defina el ID automáticamente...
curl -XPOST 'localhost:9200/items/item' -d '{
"id" : "MLA-123"
"title": "Delorean modelo '85, joya nunca taxi",
"kmts" : 325000
"seller": "MACFLY_1980"
}'
nombretipooperación
HTTP RESTnombreíndice
documento JSON a indexar
Curso de Capacitación - Julio 2014
Insertando datos: Index API
... obteniendo como respuesta:
{
"ok" : true,
"_index" : "items",
"_type" : "item",
"_id" : "MLA123",
"_version" : 1
}
nombre del índice
nombre del tipo
id del documento
versión del cocumento
● 201 (CREATED): Se creó un nuevo documento
● 200 (OK): Se actualizó un documento existente
Curso de Capacitación - Julio 2014
Insertando datos: Index API
Ejecución distribuida:
1. Se genera el request a un nodo dado.
NODO 1
Shard 1(primario)
Shard 0(replica)
Shard 1(replica)
NODO 2
Shard 0(primario)
1.
3.
2.
$curl -XPUT ... Cliente
Curso de Capacitación - Julio 2014
Insertando datos: Index API
2. El server lee el valor de routing (por defecto el _id) y determina en cuál shard primario (Shard 1) se indexa el documento
3. Una vez indexado el documento en el shard primario, se propaga a las réplicas
● Permite obtener un documento dado su tipo y ID
curl -XGET 'localhost:9200/items/item/MLA1234'
nombretipooperación
HTTP RESTnombreíndice ID documento
● 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:
{
"exists" : true,
"_index" : "items",
"_type" : "item",
"_id" : "MLA1234",
"_version" : 1
"_source" : {
"id" : "MLA1234"
"title" : "Delorean...",
"kmts" : 325000,
"seller": "MACFLY_1980"
}
}
nombre del índice
nombre del tipo
id del documento
versión del cocumento
● 200 (CREATED): Si el documento existe
● 404 (NOT FOUND): Si no existe
contenido del documento
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.
{
...
"_id" : "MLA1234",
"_fields" : {
"seller_id": 123136,
"item_id": “MLA1234”,
...
}
}
contenido del campo
Curso de Capacitación - Julio 2014
Obteniendo datos: Get API
curl -XGET 'localhost:9200/items/item/MLA1234?
_source_include=*id&_source_exclude=*picture
Ejecución distribuida:
1. Se genera el request
2. El server lee el valor de routing (por defecto el _id) y determina en qué shard se encuentra el documento (Shard 1).Luego el nodo receptor realizar un round-robin entre todos los shards primarios y réplicas
3. Se accede finalmente al shard y se obtiene el documento.
NODO 1
Shard 1(primario)
Shard 0(replica)
Shard 1(replica)
NODO 2
Shard 0(primario)
1.
2.
3.
$curl -XGET ... Cliente
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
Obteniendo datos: Get 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
2. El server lee el valor de routing (por defecto el _id) y determina en qué shard primario (Shard 1) se encuenta el documento
3. Una vez borrado el documento en el shard primario, se propaga la operación en las réplicas
NODO 1
Shard 1(primario)
Shard 0(replica)
Shard 1(replica)
NODO 2
Shard 0(primario)
1.
3.
2.
$curl -XDELETE ... Cliente
Curso de Capacitación - Julio 2014
Eliminando datos: Delete API
● 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
Implementando Optimistic Locking...
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
Versionado de documentos
● 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: Update
● 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: Multi-get
● 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
{ "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
Operación a realizar
Cuerpo del documento(opcional)
Todas las líneas deben terminar en un "retorno de carro"
Curso de Capacitación - Julio 2014
Otras operaciones: Bulk
● 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".
Formato de respuesta:
¡es mucho más rápido que request individuales!
Curso de Capacitación - Julio 2014
Otras operaciones: Bulk
Search API(Búsquedas básicas)
Curso de Capacitación - Julio 2014
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
● 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
Algunas funcionalidades importantes:
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'
{"took" : 5, "timed_out" : false, "_shards" : {
"total" : 5,"successful" : 5,"failed" : 0
},...
}
tiempo insumido (ms)
'true' si dió timeout
shards involucrados(exitosos y fallidos)
● Header de la respuesta:
Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API
"hits":{
"total":1,
"max_score":0.3125,
"hits":[
{
"_index":"items",
"_type":"item",
"_id":"MLA123",
"_score":0.3125,
"_source":{
"id":"MLA123",
"title":"Cámara Sony HD"
}
}
]
total de resultados
los resultados de la primer "página"
fuente del documento
● Cuerpo de la respuesta:
Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API
Ejecución distribuida:
1. Se genera el request
2. El server determina en qué shards (primario o réplica) se encuentran los documentos (search)
3. Finalmente reunen los datos de los shards correspondientes (reduce)
NODO 1
Shard 1(primario)
Shard 0(replica)
Shard 1(replica)
NODO 2
Shard 0(primario)
1.
3.
2.
Cliente
Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API
También permite búsquedas complejas
curl -XGET 'localhost:9200/items/_search?q=sony+OR+nikon'
● Búsquedas booleanas
curl -XGET 'localhost:9200/items/_search?q=price:[10+TO+*]'
● Búsquedas por rango
● ...y mas (búsquedas difusas, expansión de frases, filtros, etc)
¿pero queremos todo en una línea?
Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API
Search+Routing(Ruteando datos)
Curso de Capacitación - Julio 2014
● 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 3
Shard 4 ... Shard N
Shard 2
Cliente
Curso de Capacitación - Julio 2014
Redireccionando datos: Routing
curl -XGET localhost:9200/users/user/_search -d '{...}'
● Al indexar podemos indicar un valor de _routing el cual
determina a qué shard acceder directamente.
curl -XPUT localhost:9200/users/user/1?routing=MLB -d '{...}'
Curso de Capacitación - Julio 2014
Redireccionando datos: Routing
Cliente
Index
Shard 1 Shard 3
Shard 4 ... Shard N
Shard 2
● Al buscar, si aplicamos routing accedemos sólo a él shard
(primario o réplica) que contiene la información relevante
curl -XGET localhost:9200/users/user/_search?routing=MLB -d '{...}'
Curso de Capacitación - Julio 2014
Redireccionando datos: Routing
Cliente
Index
Shard 1 Shard 3
Shard 4 ... Shard N
Shard 2
● Esto mejora notablemente la performance de las
búsquedas e indexaciones.
Curso de Capacitación - Julio 2014
Búsquedas de texto: Search API
Query DSL(Búsquedas complejas)
Curso de Capacitación - Julio 2014
● 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
Queries
Filtros
{
"query": {
"filtered": {
"query": {
"match": {"title":"iphone 4s"}
},
"filter": {
"term": {"status": "active"}
}
}
}
}
Curso de Capacitación - Julio 2014
Búsquedas complejas: Query DSL
Formato:
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
● 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”
}
}
}
Buscando frases...
Curso de Capacitación - Julio 2014
Búsquedas complejas: Match Query
● 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
}
}
}
Buscando frases por prefijo
Curso de Capacitación - Julio 2014
Búsquedas complejas: Match Query
{
"multi_match" : {
"fields" : ["titulo","descripcion","atributo.*"],
"query" : “Item de testeo”,
}
}
Permite buscar en varios campos
● Admite expresiones regulares en los nombres de campos
Curso de Capacitación - Julio 2014
Búsquedas complejas: Match Query
● Compone queries y es compuesta a su vez
● Tipos
○ should, must y must_not
● Parámetros opcionales
○ minimun_shoud_match
○ disable_coord
Implementa operaciones booleanas entre resultados.
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: Bool Query
● Búsquedas por rangos
○ Númericos / Fechas
○ Strings (por orden lexicográfico)
● Parámetros
○ gt (mayor) / gte (mayor o igual)
○ lt (menor) / lte (menor o igual)
{
"range" : {
"precio" : {
"gte": 100,
"lt": 150
}
}
}
Curso de Capacitación - Julio 2014
Búsquedas complejas: Range Query
Devuelve todos los documentos
● Generalmente en combinación con otros filtros
{
"match_all" : { }
}
Curso de Capacitación - Julio 2014
Búsquedas complejas: Match_all Query
● 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
Búsquedas complejas: otras queries
Curso de Capacitación - Julio 2014
Query Filters(Optimizando búsquedas)
● 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
Búsquedas complejas: Filtros
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":{ "and":[ {"term": {"listing":"silver"}}, {"term": {"seller": 76060303}} ] }}
Composición de
query y filters...
Curso de Capacitación - Julio 2014
Queries vs Filters
{
"from" : 10, "size" : 30,
"query" : {
"filtered" : {
"filter" : {
"term" : {
"seller_id" : "76060303"
}
}
}
},
"sort" : [ {
"start_time" : {
"order" : "desc",
"missing" : "_last"
}
}]
}
paginado
Ordenamiento
Curso de Capacitación - Julio 2014
Ordenamiento y paginado
Lucene(Muy breve introducción)
Curso de Capacitación - Julio 2014
¿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.
● 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.
"Apache Lucene is a free/open source information retrieval software library"
Curso de Capacitación - Julio 2014
Breve introducción a Lucene
Analyzers(Análisis y procesamiento de texto)
Curso de Capacitación - Julio 2014
¿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
● 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).
Técnicas generales de procesamiento de texto:
Curso de Capacitación - Julio 2014
Análisis de texto: Analyzers
"A la grande le puse Cúca"
A la grande pusele Cúca
Tokenizing
a la grande pusele cúca
grande puse cúca
grande puse cuca
ignore-case filters
stopwords filters
ignore special chars filters
Curso de Capacitación - Julio 2014
Análisis de texto: Analyzers
● 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.
Un Analyzer está compuesto de:
Curso de Capacitación - Julio 2014
Análisis con ES: anatomía de un Analyzer
...Elasticsearch provee tokenizers prearmados y permite generar nuevos personalizados
● Análisis en la indexación:
IndexTokenizer FilterFilterFilterTexto entrada
Tokens salida
● Análisis en la búsqueda:
SearchTokenizer FilterFilterFilterquery"match":"la ola"
query"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", "[email protected]"]
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.Útil para mutilenguaje y autcomplete. (ej: n=2)
["El", "la", "as", "st"...]
stemmer / snowball
Filtros algorítmicos. Especializados en un lenguaje
["elastico"," elast"]
hspell stemming basado en diccionarios ["elastico"," elastica"]
Curso de Capacitación - Julio 2014
Análisis con ES: anatomía de un Analyzer
● Introducción● Capa distribuida● E/S de datos● Búsquedas básicas● Lucene● Búsquedas avanzadas● Analyzers
● Mapping● Relevancia (Scoring)● Aggregations● Integración● Puesta en Producción● Funcionalidades
avanzadas
Curso de Capacitación - Julio 2014
AgendaDía 1 Día 2
Curso de Capacitación - Julio 2014
Mapping(Configurando los tipos de datos)
● 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: ¿Qué es?
● 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: mapeo dinámico
Es el mapeo que Elasticsearch aplica por defecto
● 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
¿Cuando debería definir un mapeo?
Curso de Capacitación - Julio 2014
Mapping: configuración
● En la creación del indice...
Los mapeos pueden definirse de dos formas:
Curso de Capacitación - Julio 2014
Mapping: configuración
$curl -XPOST localhost:9200/test -d '{
"settings" : { … },
"mappings" : {
"item" : {
"properties" : {
"listing_type" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
}
}'
● Mediante PUT a API de Mapping
Curso de Capacitación - Julio 2014
Mapping: configuración
Cuidado: los cambios en un mapping existente no se aplican hacia atrás
$ curl -XPUT 'http://localhost:9200/users/item/_mapping' -d '
{
"item" : {
"properties" : {
"listing_type" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
}'
Los mapeos pueden definirse de dos formas:
● Tipos de datos (pueden ser de un único tipo o array)
Tipo Descripción
string, integer, long, float, double, date, boolean
Los clásicos...
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: configuración
● 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, index_analyzer
Define analyzer a utilizarse al buscar/indexar
Curso de Capacitación - Julio 2014
Mapping: campos de tipo texto
● 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 numérico
● Representados por Strings con formato específico
Tipo Descripción
formatDefine el formato de la fecha. Existen varios predefinidos (por defecto ISO8601) pero tambien soporta personalizados
ignore_malformed Ignora mal formateados. Por defecto en "false"
Curso de Capacitación - Julio 2014
Mapping: campos de tipo fecha
Curso de Capacitación - Julio 2014
Mapeos: Campos de tipo objeto
Tipo Descripción
propertiesAtributo(s) del objeto, puede ser del tipo "core" o a su vez otro objeto
dynamicPor defecto en "true". Permite agregar dinámicamente 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
● Permite crear campos de tipos de datos compuestos
{ "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: campos de tipo objeto
● 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
Permite indexar un mismo campo de diferentes formas
"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
Mapping: Multi-fields
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
¿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: introducción
● 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.
Curso de Capacitación - Julio 2014
Scoring: algoritmos
...veamos como lo implementa Elasticsearch
● Algoritmo implementado por
Lucene para scoring.
● Implementación de TF-IDF.
● Incorpora normalización y
boosting.
● Se ejecuta en cada búsqueda de
texto libre (match)
Curso de Capacitación - Julio 2014
Scoring: algoritmos
Lucene Similarity:
"hits":{
"total":1,
"max_score":0.3125,
"hits":[
{
"_index":"items",
"_type":"item",
"_id":"MLA123",
"_score":0.3125,
"_source":{
"id":"MLA123",
"title":"Cámara Sony HD"
}
}
]
● A mayor cantidad de ocurrencias de un término en un
documento, mayor relevancia (score).
Curso de Capacitación - Julio 2014
Scoring: Lucene Similarity
"...MercadoLibre realizó su primera Developer Conference basadas en sus APIs donde se presentaron....MercadoLibre anunció hoy que los desarrolladores de software podrán tener acceso a las APIs..."
"...Hace mucho tiempo que se pedía que MercadoLibre desarrolle una API para realizar consultas a la pagina de manera mas sencilla, a que hasta hace un tiempo solo teníamos XML y dolor de cabeza..."
>
Ejemplo: buscando "API":
Documento 1: Documento 2:
● Términos poco frecuentes entre los documentos aportan
mayor peso a la relevancia total.
Curso de Capacitación - Julio 2014
Scoring: Lucene Similarity
Ejemplo: buscando "Mercadolibre APIs Conference":
"...MercadoLibre realizó su primera Developer Conference donde se presentaron las novedades sobre....
"...Hace mucho tiempo que se pedía que MercadoLibre desarrolle unas APIs para realizar..."
>
"...Las APIs de MercadoLibre son una plataforma ideal para desarrollar aplicaciones..."
,..,
Documento 1: Documento 2: Documento N:
● A mayor cantidad de términos de búsqueda en un
documento, mayor relevancia.
Curso de Capacitación - Julio 2014
Scoring: Lucene Similarity
"...MercadoLibre realizó su primera Developer Conference basadas en sus APIs donde se presentaron....La empresa anunció hoy que los desarrolladores de software podrán tener acceso.."
"...Las oportunidades ahora son ilimitadas, podremos integrar grandes retailers a MercadoLibre, desarrollar soluciones logísticas, entre otras opciones. En definitiva, seguiremos trabajando para..."
>
Ejemplo: buscando "Mercadolibre API":
Documento 1: Documento 2:
● Campos "cortos" tienen más relevancia que los "largos".
Curso de Capacitación - Julio 2014
Scoring: Lucene Similarity
"MercadoLibre realizó su primera Developer Conference en San Pablo"
"Podremos integrar grandes retailers a MercadoLibre, desarrollar soluciones logísticas, entre otras opciones. En definitiva, seguiremos trabajando para..."
>
Ejemplo: buscando "Mercadolibre":
Título de Documento 1: Cuerpo de Documento 2:
¿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
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 para la query ejecutada
atributo del documento
Ejemplos de boosting: blog de reviews
Curso de Capacitación - Julio 2014
Scoring: boosting
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.
Ejemplos de boosting: blog de reviews
Curso de Capacitación - Julio 2014
Scoring: boosting
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
● 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
¿Para qué sirve?
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
Cambio precio de 200 a 150
Upgrade a gold_premium
envios gratis2da republicación arrastra ventas y
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": {
"categoria": {
"terms": { "field": "category_id" },
"aggs": {
"tipo_publicacion" : {
"terms" : { "field" : "listing_type_id"},
"aggs" : {
"prom_precio" : { "avg": { "field": "price"} },
"min_precio" : { "min": { "field": "price"} },
"max_precio" : { "max": { "field": "price"} }
}
}
}
}
}
}
Nombre
Buckets
Metrics
Curso de Capacitación - Julio 2014
Aggregations: ejemplo
Responseaggregations: {
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)
● 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.
Curso de Capacitación - Julio 2014
Integración: clientes
... existen dos categorías de clientes
Aparte del protocolo HTTP se pueden implementar clientes nativos de Elasticsearch
● 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.
Curso de Capacitación - Julio 2014
Integración: clientes
Transport Client
Nodo 1
Cliente
Nodo 3
... Nodo N
Nodo 2
Nodo 4
● 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.
Curso de Capacitación - Julio 2014
Integración: clientes
Node Client
Cluster
Nodo 1
Cliente
Nodo 3
... Nodo N
Nodo 2
Nodo 4
Curso de Capacitación - Julio 2014
Integración: Rivers
● 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
¿Que son?
● Wikipedia
● RabbitMQ
● Dropbox
Algunos ejemplos
Curso de Capacitación - Julio 2014
Producción(Configuración y recomendaciones)
● 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.
Curso de Capacitación - Julio 2014
Producción: instalación
... vamos a centrarnos en el último
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
● Archivos de la distribució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: instalación
Curso de Capacitación - Julio 2014
Producción: 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.
Algunas premisas importantes sobre configuración
... ante la duda, consulte a su experto en Elasticsearch más cercano
● Configuración principal de un cluster/nodo
Nombre Descripción
cluster.nameNombre del cluster. En base a él se unen los nodos, con lo que debe ser único.
node.name Nombre del nodo. ES asigna valores por defecto
path.dataUbicación de los datos. Configurar siempre fuera del 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. minimum_master_nodes
Mínima cantidad de Masters. Conviene definir N/2+1 donde N es la cantidad de masters elegibles.
discovery.zen.ping. multicast.enabled
Descubrimiento de nodos vía multicast. En producción debe estar deshabilitado (false).
discovery.zen.ping. unicast.hosts
Lista de posibles masters a consultar para descubrir el cluster. Basta con que uno de los nodos pertenezca al cluster para integrarse.
Curso de Capacitación - Julio 2014
Producción: configuración
● Sistema distribuido: recupero
Curso de Capacitación - Julio 2014
Producción: configuración
Nombre Descripción
gateway. recover_after_nodes
Cantidad mínima de nodos necesaria para recuperar el cluster luego de reinicio de todos los nodos. Mayor número implica reuso de datos locales y menor transferencias de shards
gateway. recover_after_time
Cantidad de minutos a esperar otros nodos una vez que se levantaron los N nodos anteriores.
Curso de Capacitación - Julio 2014
Producción: memoria
● 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
Definiendo el tamaño del Heap
Curso de Capacitación - Julio 2014
Producción: 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.
Principales "usuarios" de la memoria
Curso de Capacitación - Julio 2014
Producción: memoria
● 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.
En caso de una OutOfMemoryException
Curso de Capacitación - Julio 2014
Producción: file descriptors
● 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:
Cantidad de descriptores de archivos (y sockets) abiertos por el proceso, permitidos por el SO
curl 'localhost:9200/_nodes/process?pretty'
Curso de Capacitación - Julio 2014
Producción: dimensionamiento
● No hay recetas mágicas.○ Cada instalación es diferente.
○ Depende de la infraestructura, los datos y las queries.
¿Cómo dimensionar un cluster?
● Es posible determinar el máximo tamaño de un sharda. 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
● 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
Algunos tips importantes a tener en cuenta
Curso de Capacitación - Julio 2014
Producción: hardware
● 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.
¿Qué infraestructura se recomienda?
Curso de Capacitación - Julio 2014
Producción: monitoreo
● 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
Todo en ES puede monitorearse vía APIs...... ¡y debe monitorearse!
Curso de Capacitación - Julio 2014
Producción: monitoreo
● 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
Los plugins más recomendados:
Curso de Capacitación - Julio 2014
Producción: monitoreo
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
...
¿Y si quiero/necesito usar curl? ¡CAT API!
Curso de Capacitación - Julio 2014
Bonus Track(algunas funcionalidades avanzadas)
Curso de Capacitación - Julio 2014
Bonus Track: percolation
● En lugar de indexar documentos y buscarlos con queries...
● ... almacenamos queries y las "filtramos" con documentos.
Búscando búsquedas... ¿lo qué?
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
● Sin indexarlos
Luego percolamos los documentos
curl -X POST localhost:9200/user/user/_percolate -d '{
"doc": {"reputation" : "5_red","negative_calif" : 23}
}'
{ "ok" : true, "matches" : ["usuario-trucho"]}
curl -X POST localhost:9200/user/user/?percolate=* -d '{
"reputation" : "5_red","negative_calif" : 23
}'
● Al indexarlos
● Resultado
curl -XPUT 'localhost:9200/_snapshot/fs_backup' -d '{
"type" : "fs",
"settings": {
"location": "/es/backups",
}
}'
Curso de Capacitación - Julio 2014
Bonus Track: snapshots
● Primero se crea un repositorio indicando el tipo.
Desde ES 1.x es posible salvar el estado del cluster
nombre del repo
tipo de repositorio
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"
}'
curl -XPOST "localhost:9200/_snapshot/fs_backup/2014" -d '{
"indices": "indice_*"
}'
● Y luego se recupera cuando es necesario (previo cierre)
Curso de Capacitación - Julio 2014
Bonus Track: geo locations
● Una vez seteado el mapping correcto, indexamos la info
Elasticsearch permite buscar zonas geográficas
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
● 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
Algunas páginas interesantes: