Anda di halaman 1dari 182
Elasticsearch Implementando búsquedas de datos eficientes y escalables Cool ... bonsai cool
Elasticsearch Implementando búsquedas de datos eficientes y escalables Cool ... bonsai cool
 

Elasticsearch

   
 

Implementando búsquedas de datos eficientes y escalables

 

Cool

...

bonsai cool

¿Quiénes somos? Fernando A. Rodriguez (Desarrolador Sr, SYI) Federico A. Ocampo (Supervisor, Buyingflow)
¿Quiénes somos? Fernando A. Rodriguez (Desarrolador Sr, SYI) Federico A. Ocampo (Supervisor, Buyingflow)

¿Quiénes somos?

Fernando A. Rodriguez

(Desarrolador Sr, SYI)

¿Quiénes somos? Fernando A. Rodriguez (Desarrolador Sr, SYI) Federico A. Ocampo (Supervisor, Buyingflow)
¿Quiénes somos? Fernando A. Rodriguez (Desarrolador Sr, SYI) Federico A. Ocampo (Supervisor, Buyingflow)

Federico A. Ocampo

(Supervisor, Buyingflow)

Objetivos ● ... Introducir al mundo de los motores de búsquedas y cómo utilizarlas para encarar
Objetivos ● ... Introducir al mundo de los motores de búsquedas y cómo utilizarlas para encarar

Objetivos

...

Introducir al mundo de los motores de búsquedas y

cómo utilizarlas para encarar estos desafíos.

y

sus desafíos. Aprender las características centrales de

Todo esto teniendo en cuenta los requerimientos de

Elasticsearch (y Lucene) ...

performance y escalabilidad de Mercadolibre

Agenda Día 1 Día 2 ● Introducción ● ● ● ● ● ● ● Mapping Capa
Agenda Día 1 Día 2 ● Introducción ● ● ● ● ● ● ● Mapping Capa
   

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

Búsquedas Las búsquedas son la principal interfaz para la obtención de información en la actualidad.
Búsquedas Las búsquedas son la principal interfaz para la obtención de información en la actualidad.

Búsquedas

Las búsquedas son la principal interfaz para la obtención de información en la actualidad.

Búsquedas: Motores conocidos

Búsquedas: Motores conocidos
Búsquedas: Motores conocidos

Búsquedas: Motores conocidos

Búsquedas: Motores conocidos

Búsquedas: Motores conocidos Búsquedas: Motores conocidos
Búsquedas: Motores conocidos Búsquedas: Motores conocidos

Búsquedas: Motores conocidos

Búsquedas: Motores conocidos
Búsquedas: Motores conocidos

Búsquedas: desafíos

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

Pero las búsquedas tienen sus

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

desafíos...

Búsquedas: desafíos

Búsquedas: desafíos
Búsquedas: desafíos

Búsquedas: desafíos

Búsquedas: desafíos
Búsquedas: desafíos

Búsquedas: desafíos

Búsquedas: desafíos ? ?
? ?
?
?

Búsquedas: herramientas

Búsquedas: herramientas Existen muchos productos y herramientas para implementar búsquedas de texto ... ● Bases de

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

Introducción a Elasticsearch
Introducción a Elasticsearch

Introducción a Elasticsearch

¿Qué es Elasticsearch?

¿Qué es Elasticsearch? Es un motor de búsqueda , orientado a documentos , basado en Apache

Es un motor de búsqueda, orientado a

documentos, basado en Apache Lucene

Breve reseña histórica

Breve reseña histórica ● Creado por Shay “Kimchy” Banon en el 2010: “ ElasticSearch itself washttp://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) " id="pdf-obj-15-5" src="pdf-obj-15-5.jpg">
 

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)

¿Qué características tiene?

¿Qué características tiene? ● Orientado a documentos ○ JSON's, Basado en Apache Lucene ● Libre de

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

¿Y qué puede hacer?

¿Y qué puede hacer? ● Búsquedas no estructuradas ○ ○ Todos los items que contengan la

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!

Una muestra gratis :¬)

Una muestra gratis :¬) # Crear un documento curl -XPOST "http://localhost:9200/items/item/MLA1" -d '{ "title" : "Condensador

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

Todo muy lindo pero

..

¿quién lo usa?

Todo muy lindo pero .. ¿quién lo usa?
Todo muy lindo pero .. ¿quién lo usa?

Componentes principales

Componentes principales Elasticsearch se compone de dos capas principales bien definidas y desacopladas: ● Sistema distribuido

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

Sistema distribuido
Sistema distribuido

Sistema

distribuido

Sistema distribuido: introducción

Sistema distribuido: introducción ¿Qué esperamos en Meli de un sistema distribuido? ● Performance ● Escalabilidad ●

¿Qué esperamos en Meli de un sistema distribuido?

Performance

Escalabilidad

Alta disponibilidad

Tolerancia a fallos

Sistema distribuido: glosario

Sistema distribuido: glosario Cluster Conjunto de instancias de ES que comparten mismo nombre (cluster.name) Nodos Indices
Cluster
Cluster
Sistema distribuido: glosario Cluster Conjunto de instancias de ES que comparten mismo nombre (cluster.name) Nodos Indices

Conjunto de

instancias de ES

que comparten

mismo nombre

(cluster.name)

Nodos Indices Instancia de Colección de varios Elasticsearch documentos (objeto JSON), no necesariamente de igual estructura.
Nodos
Indices
Instancia de
Colección de varios
Elasticsearch
documentos
(objeto JSON), no
necesariamente de
igual estructura.
Comparable a
esquemas de bases
de datos
No confundir con
índices de bases de
datos
Tipos
Tipos

Colección de varios

documentos de

similar estructura

Comparable a

tablas de bases de

datos

Sistema distribuido: Ejemplo

Sistema distribuido: Ejemplo USUARIO Preguntas Compras Cluster: springfield Indice: usuario Tipo: preguntas NODO NODO 1 ES
USUARIO
USUARIO

Preguntas

Compras

Cluster: springfield Indice: usuario Tipo: preguntas

NODO NODO 1 ES USUARIO preguntas { ... } compras { ... }
NODO NODO 1 ES
USUARIO
preguntas
{
...
}
compras
{
...
}

Sistema distribuido: más sobre shards

Sistema distribuido: más sobre shards ● Partición de la información. ● Puede ser Primario (read/write) o

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

Sistema distribuido: Ejemplo shard

Sistema distribuido: Ejemplo shard 1 shard Usuario Pregunta homero p1 homero p2 lisa p3 moe p4
1 shard
1 shard
 

NODO Usuario 1

 

Pregunta

   

homero

p1

 

homero

 

p2

lisa

p3

moe

p4

bart

p5

bart

p6

bart

p7

bart

p8

 

2 shards

 

NODO 1

Usuario

Pregunta

 
 

homero

p1

 

homero

p2

lisa

p3

moe

p4

 
 
 

Usuario

Pregunta

 

bart

p5

bart

p6

bart

p7

bart

p8

 

Sistema distribuido: shards y réplicas

Sistema distribuido: shards y réplicas NODO 1 NODO 2 Shard 0 Shard 1 (primario) (primario) Shard
NODO 1 NODO 2 Shard 0 Shard 1 (primario) (primario) Shard 1 Shard 0 (replica) (replica)
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

}'

}

Sistema distribuido: shards y réplicas

Sistema distribuido: shards y réplicas Agregando un nodo ... NODO 1 NODO 2 NODO 3 Shard

Agregando un nodo ...

NODO 1 NODO 2 NODO 3 Shard 0 Shard 1 (primario) (primario) Shard 1 Shard 0
NODO 1
NODO 2
NODO 3
Shard 0
Shard 1
(primario)
(primario)
Shard 1
Shard 0
(replica)
(replica)

Sistema distribuido: shards y réplicas

Sistema distribuido: shards y réplicas ... se balancea el cluster automáticamente. NODO 1 NODO 2 NODO

...

se

balancea el cluster automáticamente.

NODO 1 NODO 2 NODO 3 Shard 0 Shard 1 (primario) (primario) Shard 1 Shard 0
NODO 1
NODO 2
NODO 3
Shard 0
Shard 1
(primario)
(primario)
Shard 1
Shard 0
Shard 0
(replica)
(replica)
(replica)

Sistema distribuido: shards y réplicas

Sistema distribuido: shards y réplicas ... se balancea el cluster automáticamente. NODO 1 NODO 2 NODO

...

se

balancea el cluster automáticamente.

NODO 1 NODO 2 NODO 3 Shard 0 Shard 1 (primario) (primario) Shard 1 Shard 0
NODO 1
NODO 2
NODO 3
Shard 0
Shard 1
(primario)
(primario)
Shard 1
Shard 0
(replica)
(replica)

Sistema distribuido: shards y réplicas

Sistema distribuido: shards y réplicas Ante la caida de un nodo ... NODO 1 Shard 0

Ante la caida de un nodo ...

NODO 1 Shard 0 (primario) Shard 1 (replica)
NODO 1
Shard 0
(primario)
Shard 1
(replica)
NODO 2 NODO 3 Shard 1 (primario) Shard 0 (replica)
NODO 2
NODO 3
Shard 1
(primario)
Shard 0
(replica)

Sistema distribuido: shards y réplicas

Sistema distribuido: shards y réplicas ... se regeneran los shard faltantes NODO 1 NODO 2 NODO

...

se regeneran los shard faltantes

NODO 1
NODO 1
NODO 2 NODO 3 Shard 1 Shard 0 (primario) (primario) Shard 0 Shard 1 (replica) (replica)
NODO 2
NODO 3
Shard 1
Shard 0
(primario)
(primario)
Shard 0
Shard 1
(replica)
(replica)

Sistema distribuido: simulación

Sistema distribuido: simulación NODO 1 NODO 2 Vamos a experimentar un poco con los shards ...

NODO 1

 

NODO 2

 
         
 

Vamos a experimentar un poco

con los shards ...

 
Data In / Out
Data In / Out

Data In / Out

Estructura de datos

Estructura de datos ● Los documentos se representan en formato JSON ● Cada campo contiene información

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

}

 

Estructura de datos

Estructura de datos ● ES agrega su propia Metadata a los documentos Campo Default Descripción _id

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

Tipos de datos

Tipos de datos ES soporta los tipos de datos propios de JSON y otros tipos derivados,

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

Insertando datos: Index API

Insertando datos: Index API Primero necesitamos un índice ... Nombre del índice curl -XPUT ‘localhost:9200/ items’

Primero necesitamos un índice...

     
 

Nombre del índice

 
Insertando datos: Index API Primero necesitamos un índice ... Nombre del índice curl -XPUT ‘localhost:9200/ items’

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.

Insertando datos: Index API

Insertando datos: Index API Luego agregamos la información ... nombre tipo nombre índice operación HTTP REST

Luego agregamos la información ...

nombre tipo
nombre
tipo
nombre índice
nombre
índice
operación HTTP REST
operación
HTTP REST
Insertando datos: Index API Luego agregamos la información ... nombre tipo nombre índice operación HTTP REST

documento JSON

a indexar

ID documento

curl -XPUT 'localhost:9200/items/item/MLA123' -d '{

"id"

: "MLA-123"

"title" : "Delorean modelo '85, joya nunca taxi",

"kmts" : 325000

"seller": "MACFLY_1980"

}'

Insertando datos: Index API

Insertando datos: Index API Podemos dejar que ES defina el ID automáticamente ... nombre tipo nombre

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

nombre tipo
nombre
tipo
nombre índice
nombre
índice
operación HTTP REST
operación
HTTP REST
Insertando datos: Index API Podemos dejar que ES defina el ID automáticamente ... nombre tipo nombre

documento JSON

a indexar

curl -XPOST 'localhost:9200/items/item' -d '{

"id"

: "MLA-123"

"title" : "Delorean modelo '85, joya nunca taxi",

"kmts" : 325000

"seller": "MACFLY_1980"

}'

Insertando datos: Index API

Insertando datos: Index API ... obteniendo como respuesta: 201 (CREATED): Se creó un nuevo documento ●
... obteniendo como respuesta: 201 (CREATED): Se creó un nuevo documento ● 200 (OK): Se actualizó
...
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

}

Insertando datos: Index API

Insertando datos: Index API Ejecución distribuida: 1. Se genera el request a un NODO 1 NODO

Ejecución distribuida:

1. Se genera el request a un NODO 1 NODO 2 nodo dado. 3. Shard 1
1.
Se genera el request a un
NODO 1
NODO 2
nodo dado.
3.
Shard 1
Shard 1
(primario)
(replica)
2.
El server lee el valor de
routing (por defecto el
Shard 0
Shard 0
_id) y determina en cuál
(replica)
(primario)
2.
shard primario (Shard 1)
se indexa el documento
3.
Una vez indexado el
1.
documento en el shard
primario, se propaga a
$curl -XPUT ...
Cliente
las réplicas

Obteniendo datos: Get API

Obteniendo datos: Get API ● Permite obtener un documento dado su tipo y ID nombre nombre

Permite obtener un documento dado su tipo y ID

nombre nombre operación tipo ID documento índice HTTP REST curl -XGET 'localhost:9200/items/item/MLA1234'
nombre
nombre
operación
tipo
ID documento
índice
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

Obteniendo datos: Get API

Obteniendo datos: Get API ... obteniendo como respuesta: ● 200 (CREATED): Si el documento existe 404

...

obteniendo como respuesta:

● 200 (CREATED): Si el documento existe 404 (NOT FOUND): Si no existe ● nombre del
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"
"title"
: "Delorean
...
",
contenido del
"kmts"
: 325000,
documento
"seller": "MACFLY_1980"
}
}

Obteniendo datos: Get API

Obteniendo datos: Get API ● También pueden obtenerse ciertos campos específicos. ○ Permitir reducir tráfico de

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" : {
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”,

...

}

}

Obteniendo datos: Get API

Obteniendo datos: Get API Ejecución distribuida: 1. Se genera el request NODO 1 NODO 2 Shard

Ejecución distribuida:

1. Se genera el request NODO 1 NODO 2 Shard 1 Shard 1 2. El server
1.
Se genera el request
NODO 1
NODO 2
Shard 1
Shard 1
2.
El server lee el valor de
(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.

Obteniendo datos: Get API

Obteniendo datos: Get API ● Si solamente se quiere saber si existe el documento ○ Evita

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'

Eliminando datos: Delete API

Eliminando datos: Delete API ● Elimina un documento dado del índice ○ La operación consiste en

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

Eliminando datos: Delete API

Eliminando datos: Delete API Ejecución distribuida: 1. Se genera el request NODO 1 NODO 2 3.

Ejecución distribuida:

1. Se genera el request NODO 1 NODO 2 3. Shard 1 Shard 1 2. El
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)
(primario)
2.
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
...

Versionado de documentos

Versionado de documentos Implementando Optimistic Locking ... Todo documento está versionado ● ○ Se utiliza para

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

Versionado de documentos

Versionado de documentos ● Todas las escrituras retornan una nueva versión ○ La versión del documento

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'

Otras operaciones: Update

Otras operaciones: Update ● Es posible actualizar solo una parte de un documento ○ Internamente ejecuta

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

Otras operaciones: Multi-get

Otras operaciones: Multi-get ● Se pueden obtener N documentos juntos por ID ○ Esto evita múltiples

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

}

}

}

Otras operaciones: Bulk

Otras operaciones: Bulk ● Permite realizar múltiples operaciones en un solo request ○ ○ ○ Esto

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

Otras operaciones: Bulk ● Permite realizar múltiples operaciones en un solo request ○ ○ ○ Esto

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

Otras operaciones: Bulk ● Permite realizar múltiples operaciones en un solo request ○ ○ ○ Esto

Cuerpo del documento

(opcional)

Todas las líneas deben terminar

en un "retorno de carro"

Otras operaciones: Bulk

Otras operaciones: Bulk Formato de respuesta: ● Contiene una respuesta individual para cada operación. ● Se

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!

Search API (Búsquedas básicas)
Search API (Búsquedas básicas)

Search API

(Búsquedas básicas)

Búsquedas de texto: Search API

Búsquedas de texto: Search API Hasta ahora no dijimos nada de búsquedas en ES .... ●

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?

Búsquedas de texto: Search API

Búsquedas de texto: Search API
Búsquedas de texto: Search API

Búsquedas de texto: Search API

Búsquedas de texto: Search API
Búsquedas de texto: Search API

Búsquedas de texto: Search API

Búsquedas de texto: Search API Algunas funcionalidades importantes: ● Relevancia ( Scoring ) ○ Define qué

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

Búsquedas de texto: Search API

Búsquedas de texto: Search API ● Ejecutando una búsqueda simple (todo los campos): curl -XGET 'localhost:9200/items/

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, "timed_out" : false, 'true'
Header de la respuesta:
{
tiempo insumido (ms)
"took" : 5,
"timed_out" : false,
'true' si dió timeout
"_shards" : {
"total" : 5,
shards involucrados
"successful" : 5,
(exitosos y fallidos)
"failed" : 0
},
},

...

}

Búsquedas de texto: Search API

Búsquedas de texto: Search API ● Cuerpo de la respuesta: " hits ":{ " total ":1,

Cuerpo de la respuesta:

"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

Búsquedas de texto: Search API ● Cuerpo de la respuesta: " hits ":{ " total ":1,

los resultados de la

primer "página"

fuente del

documento

Búsquedas de texto: Search API

Búsquedas de texto: Search API Ejecución distribuida: 1. Se genera el request NODO 1 NODO 2

Ejecución distribuida:

1. Se genera el request NODO 1 NODO 2 Shard 1 Shard 1 2. El server
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
2.
Shard 0
Shard 0
(replica)
(primario)
documentos (search)
3.
Finalmente reunen los
3.
datos de los shards
1.
correspondientes (reduce)
Cliente

Búsquedas de texto: Search API

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'

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?

Search+Routing (Ruteando datos)
Search+Routing (Ruteando datos)

Search+Routing

(Ruteando datos)

Redireccionando datos: Routing

Redireccionando datos: Routing ● ● Por defecto, los documentos se distribuyen uniformemente entre todos los shards.

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
Index
Shard 1
Shard 2
Shard 3
Shard 4
...
Shard N
Cliente

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

...

}'

Redireccionando datos: Routing

Redireccionando datos: Routing ● Al indexar podemos indicar un valor de _routing el cual determina a

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

Index Shard 1 Shard 2 Shard 4 ... Cliente
Index
Shard 1
Shard 2
Shard 4
...
Cliente
Shard 3
Shard 3
Shard N
Shard N

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

...

}'

Redireccionando datos: Routing

Redireccionando datos: Routing ● Al buscar, si aplicamos routing accedemos sólo a él shard (primario o

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 4 ... Cliente
Index
Shard 1
Shard 2
Shard 4
...
Cliente
Shard 3
Shard 3
Shard N
Shard N

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

...

}'

Búsquedas de texto: Search API

Búsquedas de texto: Search API ● Esto mejora notablemente la performance de las búsquedas e indexaciones.

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

Búsquedas de texto: Search API ● Esto mejora notablemente la performance de las búsquedas e indexaciones.
Búsquedas de texto: Search API ● Esto mejora notablemente la performance de las búsquedas e indexaciones.
Query DSL (Búsquedas complejas)
Query DSL (Búsquedas complejas)

Query DSL

(Búsquedas complejas)

Búsquedas complejas: Query DSL

Búsquedas complejas: Query DSL ● Permite la creación de Queries complejas. ● Se basa en la

Permite la creación de Queries complejas.

Se basa en la composición de queries.

Búsquedas complejas: Query DSL

Búsquedas complejas: Query DSL Formato: { "query": { "filtered": { "query": { Queries "match": {"title":"iphone 4s"}
Formato: { "query": { "filtered": { "query": { Queries "match": {"title":"iphone 4s"} Filtros }, "filter": {
Formato:
{
"query": {
"filtered": {
"query": {
Queries
"match": {"title":"iphone 4s"}
Filtros
},
"filter": {
"term": {"status": "active"}
}
}
}
}

Búsquedas complejas: Match Query

Búsquedas complejas: Match Query Es él término utilizado para la búsqueda de texto { “ match

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)

Búsquedas complejas: Match Query

Búsquedas complejas: Match Query Porcentaje mínimo de "matcheo" Cada token es "concatenado" por una bool 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%”

}

}

}

Búsquedas complejas: Match Query

Búsquedas complejas: Match Query Buscando frases ... ● ● Búsquedas de frases dentro de un string
 

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”

}

}

}

Búsquedas complejas: Match Query

Búsquedas complejas: Match Query Buscando frases por prefijo ● Igual a búsqueda por frase pero utilizando
 

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

}

}

}

Búsquedas complejas: Match Query

Búsquedas complejas: Match Query Permite buscar en varios campos ● Admite expresiones regulares en los nombres

Permite buscar en varios campos

 
 

Admite expresiones regulares en los nombres de campos

   

{

 
 

"multi_match" : {

"fields" : ["titulo","descripcion","atributo.*"],

"query" : “Item de testeo”,

}

}

Búsquedas complejas: Bool Query

Búsquedas complejas: Bool Query Implementa operaciones booleanas entre resultados. ● Compone queries y es compuesta a

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

Búsquedas complejas: Bool Query

Búsquedas complejas: Bool Query { " bool " : { " must " : [ {"match"

{

 

"bool" : { "must" : [ {"match" : {"tipo" : "cerveza"}}, {"match" : {"tamaño" : 250}}

], "must_not" : [ {"match" : {"marca" : "quilmes"}}

]

}

}

Búsquedas complejas: Range Query

Búsquedas complejas: Range Query ● Búsquedas por rangos ○ Númericos / Fechas ○ Strings (por orden

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

}

}

}

Búsquedas complejas: Match_all Query

Búsquedas complejas: Match_all Query Devuelve todos los documentos ● Generalmente en combinación con otros filtros {

Devuelve todos los documentos

Generalmente en combinación con otros filtros

{

 

"match_all" : { }

}

Búsquedas complejas: otras queries

Búsquedas complejas: otras queries Term query ● ○ Búsqueda sobre campo sin parsear ○ Similar match,

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

Query Filters (Optimizando búsquedas)
Query Filters (Optimizando búsquedas)

Query Filters

(Optimizando búsquedas)

Búsquedas complejas: Filtros

Búsquedas complejas: Filtros ● Varios tipos ● ○ term,bool,and,or,not,range,geo_distance, ... Pueden usarse en ● ○ filtered

Varios tipos

term,bool,and,or,not,range,geo_distance, ... Pueden usarse en

filtered query constant_score query aggregations ¡Cacheable! (super rápido)

Queries vs Filters

Queries vs Filters Queries Filters Búsquedas por texto y términos Sólo términos (responde a la pregunta

Queries

Filters

Búsquedas por texto y términos

Sólo términos (responde a la pregunta si/no)

Con relevancias Rápido (según query) Sin caching

Sin relevancia Muy Rápido Cacheable

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

Queries vs Filters

Queries vs Filters Composición de query y filters ... " filtered ":{ "query":{ ... query de

Composición de query y filters ...

"filtered":{

"query":{

...query

de búsqueda

...

},

"filter":{

"and":[

{"term": {"listing":"silver"}},

{"term": {"seller": 76060303}}

}

}

]

Ordenamiento y paginado

Ordenamiento y paginado { "from" : 10, "size" : 30, "query" : { paginado "filtered" :
{ "from" : 10, "size" : 30, "query" : { paginado "filtered" : { "filter" :
{
"from" : 10, "size" : 30,
"query" : {
paginado
"filtered" : {
"filter" : {
"term" : {
"seller_id" : "76060303"
}
}
}
},
Ordenamiento
"sort" : [ {
"start_time" : {
"order" : "desc",
"missing" : "_last"
}
}]
}
Lucene (Muy breve introducción)
Lucene (Muy breve introducción)

Lucene

(Muy breve introducción)

Breve introducción a Lucene

Breve introducción a Lucene ¿En qué capítulos de la serie Game of Thrones se menciona al

¿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?

Breve introducción a Lucene

Breve introducción a Lucene ¡Índices invertidos! ● Se toma palabra por palabra de todos los diálogos

¡Í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)

Breve introducción a Lucene

Breve introducción a Lucene Índices invertidos: Términos Frecuencia Documentos (ids) Rob 3 1,2,3 John 1 5

Í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.)

Breve introducción a Lucene

Breve introducción a Lucene Apache Lucene implementa estos índices. "Apache Lucene is a free/open source information

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.

Analyzers (Análisis y procesamiento de texto)
Analyzers (Análisis y procesamiento de texto)

Analyzers

(Análisis y procesamiento de texto)

Análisis de texto: Analyzers

Análisis de texto: Analyzers ¿Qué hace Google con mi texto de búsqueda? ● No todo lo
 

¿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

Análisis de texto: Analyzers

Análisis de texto: Analyzers
Análisis de texto: Analyzers

Análisis de texto: Analyzers

Análisis de texto: Analyzers
Análisis de texto: Analyzers

Análisis de texto: Analyzers

Análisis de texto: Analyzers Técnicas generales de procesamiento de texto: ● Tokenizing ○ Dividir el texto

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

Análisis de texto: Analyzers

Análisis de texto: Analyzers "A la grande le puse Cúca" Tokenizing A la grande le puse
"A la grande le puse Cúca"
"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
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

Análisis con ES: anatomía de un Analyzer

Análisis con ES: anatomía de un Analyzer Un Analyzer está compuesto de: ● Tokenizer ○ Divide

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

Análisis con ES: anatomía de un Analyzer

Análisis con ES: anatomía de un Analyzer Análisis en la indexación: ● Texto Tokens Tokenizer Filter
Análisis en la indexación: ● Texto Tokens Tokenizer Filter Filter Filter Index entrada salida Análisis en
Análisis en la indexación:
Texto
Tokens
Tokenizer
Filter
Filter
Filter
Index
entrada
salida
Análisis en la búsqueda:
query
query
Tokenizer
Filter
Filter
Filter
Search
"match":"ola"
"match":"la ola"

Análisis con ES: anatomía de un Analyzer

Análisis con ES: anatomía de un Analyzer ● Tokenizers: "Masche te quita-lo-bailado" Tokenizer Descripción Ejemplo keyword

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

...

Análisis con ES: anatomía de un Analyzer

Análisis con ES: anatomía de un Analyzer ● Filters: "Elástico" Filter Descripción Ejemplo lowercase Ignora capitalización

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

 
Agenda Día 1 Día 2 ● Introducción ● Mapping ● Capa distribuida ● Relevancia (Scoring) ●
Agenda Día 1 Día 2 ● Introducción ● Mapping ● Capa distribuida ● Relevancia (Scoring) ●
   

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

Mapping (Configurando los tipos de datos)
Mapping (Configurando los tipos de datos)

Mapping

(Configurando los tipos de datos)

Mapping: ¿Qué es?

Mapping: ¿Qué es? ● Los datos indexados son obtenidos de documentos y campos ● El mapeo

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

Mapping: mapeo dinámico

Mapping: mapeo dinámico Es el mapeo que Elasticsearch aplica por defecto ● Principio de "Schema-less" ○

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

Mapping: configuración

Mapping: configuración ¿Cuando debería definir un mapeo? Tipos de datos que lo requieren (no-nativos de Json)

¿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

Mapping: configuración

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

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"

}

}

Mapping: configuración

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

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

Mapping: configuración

Mapping: configuración ● Tipos de datos (pueden ser de un único tipo o array) Tipo Descripció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

Mapping: configuración

Mapping: configuración ● Parametros extras Tipo Descripción boost Grado de relevancia include_in_all Si el campo será

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

Mapping: campos de tipo texto

Mapping: campos de tipo texto ● Utilizar Strings como tipo de dato para campos de 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

Mapping: campos de tipo numérico

Mapping: campos de tipo numérico ● Puede ser float, double, integer, long, short o byte Tipo

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

Tipo

Descripción

ignore_malformed

Ignora mal formateados. Por defecto en "false"

Mapping: campos de tipo fecha

Mapping: campos de tipo fecha ● Representados por Strings con formato específico Tipo Descripción Define el

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"

Mapeos: Campos de tipo objeto

Mapeos: Campos de tipo objeto ● Permite crear campos de tipos de datos compuestos Tipo Descripción

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

Mapping: campos de tipo objeto

Mapping: campos de tipo objeto { " mensaje " : { "type" : "object", "properties" :

{

 

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

 

}

}

}

Mapping: Multi-fields

Mapping: Multi-fields Permite indexar un mismo campo de diferentes formas ● Generalmente utilizado para parsear un

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.

Mapping: Multi-fields

Mapping: Multi-fields "item" : { "properties" : { "titulo" : { " type " : "

"item" : { "properties" : { "titulo" : { "type" : "multi_field" "fields" : {

"titulo" :

"espanol" :

{ "type" : "string", "index" : "not_analyzed" } { "type" : "string",

"analyzer" : "custom_es" }, "portugues" : { "type" : "string",

}

}

}

}

"analyzer" : "custom_pt" }

Scoring (Dando relevancia a los resultados)
Scoring (Dando relevancia a los resultados)

Scoring

(Dando relevancia a los resultados)

Scoring: introducción

Scoring: introducción ¿Qué tan importante es dar relevancia a los resultados de las búsquedas? ...

¿Qué tan importante es dar relevancia a los

resultados de las búsquedas? ...

Scoring: introducción ¿Qué tan importante es dar relevancia a los resultados de las búsquedas? ...

Scoring: introducción

Scoring: introducción básicamente determina qué queremos mostrar primero ... a los usuarios, en base a sus

básicamente

determina qué queremos mostrar primero

... a los usuarios, en base a sus preferencias...

Scoring: introducción básicamente determina qué queremos mostrar primero ... a los usuarios, en base a sus

Scoring: introducción

Scoring: introducción ... o las nuestras

...

o las nuestras

Scoring: introducción ... o las nuestras

Scoring: introducción

Scoring: introducción ¿Cómo se determina la posición de un resultado? ● Algoritmos ○ Procesan información de

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