Slide 1

Slide 1 text

Elasticsearch Introducción Agustín Azzinnari @ganitsu

Slide 2

Slide 2 text

Introducción - Motor de búsqueda distribuido que trabaja a nivel de documentos JSON. - Búsquedas en texto libre o en campos estructurados. Document Store Search Engine Distribuido Apache Lucene Filters Queries Aggregations API RESTful Tipo Documento JSON Índice Cluster Shard Nodo

Slide 3

Slide 3 text

Datos (I) - Elasticsearch almacena Documentos JSON. - Unidad básica de dato. - Puede verse (un poco) como una fila en un RDBMS. - Tienen un ID y un tipo asociado. - Un tipo es (un poco) como una tabla. - Se almacenan en un índice. - Un índice es (un poco!) como una base de datos. - Schema-free (casi).

Slide 4

Slide 4 text

Datos (II) { "title": "'Doctor Who' Versus 'Sherlock'? Keep Dreaming, Comic-Con", "keywords": ["doctor-who", "sherlock-holmes", "comic-con"], "pub_date": "2015-07-09T21:56:18Z", "print_page": 7, "section_name": { "display_name": "U.S.", "content": "us", "url": "http://www.nytimes.com/pages/national/index.html" }, "web_url": "http://www.nytimes.com/aponline/2015/07/09/us/ap-us-comic-con-doctor-who-sherlock.html", "content": "..." }

Slide 5

Slide 5 text

Indexando - API RESTful (HTTP) para meter y sacar datos. - Bien estándar: POST para crear, DELETE para borrar, GET para obtener, PUT para actualizar. $ curl -XPOST 'localhost:9200/newyork/article' -d '{ "title": "''Doctor Who'' Versus ''Sherlock''? Keep Dreaming, Comic-Con", "keywords": ["doctor-who", "sherlock-holmes", "comic-con"], "pub_date": "2015-07-09T21:56:18Z", "print_page": 7, "section_name": { "display_name": "U.S.", "content": "us", "url": "http://www.nytimes.com/pages/national/index.html" }, "web_url": "http://www.nytimes.com/aponline/2015/07/09/us/ap-us-comic-con-doctor-who- sherlock.html", "content": "..." }'

Slide 6

Slide 6 text

Indexando - API RESTful (HTTP) para meter y sacar datos. - Bien estándar: POST para crear, DELETE para borrar, GET para obtener, PUT para actualizar. $ curl -XPOST 'localhost:9200/newyork/article' -d '{ "title": "''Doctor Who'' Versus ''Sherlock''? Keep Dreaming, Comic-Con", "keywords": ["doctor-who", "sherlock-holmes", "comic-con"], "pub_date": "2015-07-09T21:56:18Z", "print_page": 7, "section_name": { "display_name": "U.S.", "content": "us", "url": "http://www.nytimes.com/pages/national/index.html" }, "web_url": "http://www.nytimes.com/aponline/2015/07/09/us/ap-us-comic-con-doctor-who- sherlock.html", "content": "..." }' Ubicación de Elasticsearch Nombre del Índice Nombre del Tipo

Slide 7

Slide 7 text

Schema - En el documento anterior, ¿qué tipo tenía pub_date? - ¿Y si hago esto? POST /newyork/article/ { "title": "\'Doctor Who\' Versus \'Sherlock\'? Keep Dreaming, Comic-Con", "pub_date": "nueve de julio de dos mil quince", "print_page": 7, "content": "..." } MapperParsingException[failed to parse [pub_date]] failed to parse date field Invalid format: \"nueve de julio de dos mil quince\"]

Slide 8

Slide 8 text

Mapping - Internamente mantiene un registro del tipo de cada campo. - Elasticsearch no es exactamente schema-free. - Esta información se guarda en el mapping asociado al tipo. - Para consultarlo, API: - Se puede crear manual: - No se puede modificar. GET /newyork/article/_mapping POST /newyork/article/_mapping

Slide 9

Slide 9 text

Consultas (I) - Queremos realizar consultas más complejas sobre los datos almacenados. - Las consultas sobre los datos se hacen (también) con una API REST, donde la consulta es un JSON. - Se realiza un GET al endpoint ///_search. - Ejemplo: GET /newyork/article/_search { "query": { "match_all": {} } }

Slide 10

Slide 10 text

Consultas (II) - Tres tipos de consultas: - Queries, o consultas no estructuradas. - Filtros, o consultas estructuradas. - Agregaciones.

Slide 11

Slide 11 text

Queries (I) - Se basan en buscar palabras o frases en campos de texto libre. - Utilizan la librería - Almacena los campos de texto en un índice invertido. - Para hacer una búsqueda, se fija en qué documentos aparece la palabra y le calcula un puntaje (relevancia o score).

Slide 12

Slide 12 text

Queries (II) - Para almacenar texto en el índice invertido hay que procesarlo antes. - Esta tarea se llama text analysis. - Qué se hace exactamente depende del caso de uso. - Se especifica en el mapping. Stopwords: el, la, los Lowercasing: Gato vs. gato Stemming: jugando vs. jugó Synonyms: saltar vs. brincar "content": { "type": "string", "analyzer": "standard" }

Slide 13

Slide 13 text

Filters - Se utilizan cuando queremos filtrar documentos. - Para cada documento del índice, un filtro se cumple o no (no afecta al score). - Se usan en conjunto con queries, para restringir dominio de búsqueda.

Slide 14

Slide 14 text

Algunos Ejemplos - Buena documentación de queries y filtros. - Para empezar: https://www.elastic. co/guide/en/elasticsearch/guide/current/_most_important_quer ies_and_filters.html https://gist.github.com/nagitsu/b8e22c58f3d5965878f1

Slide 15

Slide 15 text

Agregaciones - Las consultas anteriores devuelven documentos individuales. - Las aggregations permiten obtener datos derivados de los documentos. - Mucha variedad, muy potentes, rápidos. - Resultados aproximados.

Slide 16

Slide 16 text

Modelo Distribuido (I) - Nodo: instancia de Elasticsearch. - Cluster: conjunto de nodos coordinados. - Brindan una única vista lógica de los datos. - Shard: subdivisión de un índice. - Ayudan a escalar horizontalmente. - Ayudan a distribuir la carga, paralelizando tareas. - Ayudan a brindar redundancia.

Slide 17

Slide 17 text

Modelo Distribuido (II) - Redundancia a través de la replicación de shards. - Todo esto se realiza de forma transparente al usuario. - La cantidad de shards se elige a priori para cada índice. El nivel de replicación se puede cambiar en cualquier momento. - Shard como unidad de distribución.

Slide 18

Slide 18 text

Modelo Distribuido (III) - Las consultas se pueden hacer a cualquier nodo del cluster. - Consultar a los nodos necesarios, acumula el resultado, y lo devuelve al usuario. Puede elegir una réplica en lugar de un shard primario. Tiene que juntar los resultados de cada shard.

Slide 19

Slide 19 text

Fin!