ELK Stack (I): indexación de documentos con Elasticsearch

, , No Comments
Hoy hablaré de Elasticsearch, un indexador de documentos que se está haciendo muy popular gracias al stack ELK (Elasticsearch, Logstash y Kibana). Estos tres componentes son bastante comunes en arquitecturas Big Data. Logstash facilita la ingesta de datos provenientes de fuentes distribuidas, Elasticsearch indexa los datos y Kibana permite su visualización. En esta entrada mostraré las funcionalidades básicas de Elasticsearch como motor de indexación.



Las herramientas necesarias para seguir este tutorial son:

¿Qué es Elasticsearch?

Elasticsearch es un motor de búsqueda basado en Apache Lucene que permite indexar grandes cantidades de datos para su posterior consulta de forma eficiente. Los datos o documentos que se indexan no necesitan tener una estructura determinada, aunque para un mejor funcionamiento y explotación de los mismos es recomendable su definición.

Como todo sistema orientado a Big Data, es fácilmente escalable y se puede configurar de forma distribuida. Dispone de una API RESTful para interactuar con la plataforma y los datos, un lenguaje de consulta llamado Query DSL y multitud de librerías en los principales lenguajes de programación (Java, PHP, etc.).


Wikipedia, Soundcloud o GitHub utilizan Elasticsearch para proporcionar búsquedas de información en tiempo real.

Componentes principales de Elasticsearch

A continuación se describen los componentes principales de Elasticsearch.
  • Índice: es una colección de documentos que comparten características similares. Cada índice puede contener múltiples tipos de documentos y cada tipo puede contener múltiples documentos. Por ejemplo, si creamos un índice llamado "Mi blog", podemos indexar documentos de tipo "post" o de tipo "comentario".
  • Documento: un documento se representa en formato JSON y se almacena en un índice. Cada documento tiene un tipo y un identificador único.
  • Mapeo: el mapeo se utiliza para realizar la correspondencia entre un campo de un documento JSON y su tipo de dato. Elasticsearch crea estos mapeos de forma automática al indexar un nuevo documento, aunque pueden ser asignados de forma manual también.
  • Shard: un shard es una entidad física donde se almacenan los datos para los distintos índices creados. Cada índice puede tener diversos shard, tanto primarios como secundarios (para respaldos, balanceo de carga, etc.). Los shard pueden estar distribuidos en los diferentes nodos que pueden componer un cluster Elasticsearch. Al iniciar una instancia de Elasticsearch (un nodo), se crea un cluster de nombre "elasticsearch" y se crean 5 shard primarios por cada índice.

Puesta en marcha de Elasticsearch

Después de instalar y configurar Java, deberemos descargar y descomprimir la distribución de Elasticsearch. Accederemos a la carpeta bin dentro del directorio donde hayamos descomprimido Elasticsearch y ejecutaremos el fichero elasticsearch.bat (en Windows).

Una vez iniciado, accederemos a la URL http://localhost:9200/?pretty con nuestro navegador para comprobar que funciona correctamente. Se mostrarán algunos datos básicos como el nombre del clúster y del nodo (como curiosidad, comentar que se asigna un nombre de nodo correspondiente a un personaje de Marvel...).



Ahora instalaremos el plugin kopf, para lo que abriremos una consola de comandos en el directorio bin de Elasticsearch y ejecutaremos el siguiente comando:


Una vez instalado, podremos acceder a la URL http://localhost:9200/_plugin/kopf donde veremos el cluster, los nodos, los shards y su estado.




Trabajando con documentos

Vamos ahora a indexar algunos documentos. A la hora de insertar un nuevo documento mediante la API REST, se sigue el patrón http://localhost:9200/<indice>/<tipo>/[<id>]. El índice se crea si no existe, así como el tipo. El identificador es opcional, y si no se proporciona Elasticsearch asignará uno de forma automática.

Por ejemplo, vamos a utilizar Elasticsearch para indexar nuestra biblioteca multimedia. Empezaremos por los libros, añadiendo un nuevo al índice llamado "multimedia". Realizaremos llamadas a la API mediante la extensión de Chrome Advanced Rest Client.

Indexaremos un nuevo libro realizando una petición PUT a la URL http://localhost:9200/multimedia/libro/1 enviando en el cuerpo del mensaje el siguiente documento JSON.


Podemos visualizar los índices contenidos en Elasticsearch para ver que se ha creado el nuevo índice correctamente, mediante la consulta GET http://localhost:9200/_cat/indices. Esta consulta devuelve un listado de índices en formato texto, donde veremos nuestro nuevo índice "multimedia".

Ahora vamos a realizar algunas búsquedas. Mediante la consulta GET http://localhost:9200/_search podemos visualizar todos los documentos indexados, para comprobar que nuestro libro se ha insertado correctamente.

Esta consulta de documentos, puede realizarse también en relación al índice o al tipo de documento. Por ejemplo, para obtener todos los libros se utilizaría la consulta siguiente http://localhost:9200/multimedia/libro/_search

Para realizar una búsqueda de un libro que contenga en cualquiera de sus campos un texto determinado, se puede utilizar la siguiente consulta de tipo POST http://localhost:9200/multimedia/_search En el cuerpo de la petición, enviaremos el término por el que queremos realizar la búsqueda. En este caso, vamos a buscar por la palabra "pampinoplas" enviando el siguiente JSON codificado mediante Query DSL en el cuerpo de la petición.



Si lo que queremos es buscar un libro por un campo determinado, se utilizaría la consulta POST http://localhost:9200/multimedia/_search enviando el siguiente JSON, donde se especifican los campos en los que realizar la búsqueda del término proporcionado.



Conclusiones

Elasticsearch es una excelente solución para la indexación de documentos, pensada para realizar búsquedas eficientes en grandes cantidades de datos. Es importante mencionar que Elasticsearch está concebida para realizar búsquedas rápidas, por lo que no soporta transacciones ni sus principios ACID.

El ciclo de vida de los datos suele ser de una única escritura en Elasticsearch y múltiples lecturas. Por ejemplo, puede utilizarse como soporte a bases de datos relacionales que sí soportan los principios ACID, pero que no disponen de sistemas de indexación de texto eficientes. De esta manera, se pueden replicar datos de forma asíncrona a una instancia de Elasticsearch para delegar en esta plataforma las búsquedas de texto.

Como ya he comentado, el poder de Elasticsearch aumenta en combinación con Logstash y Kibana, conformando el stack ELK. En siguientes entradas hablaré del resto de componentes de este stack y pondré algún ejemplo de uso.

Si necesitas más información sobre Elasticsearch, te recomiendo que te compres un par de libros muy completos, "Elasticsearch In Action" y "Elasticsearch: The Definitive Guide".

0 comentarios:

Publicar un comentario