Introducción a ElasticSearch y cómo instalarlo

La intención de este post es realizar una pequeña introducción a ElasticSearch, identificando sus capacidades más destacadas, así como el tipo de proyectos en el que mejor encaja esta tecnología.

ElasticSearch es un motor de  búsqueda y recuperación de documentos de tipo JSON basado en Lucene, que puede proveer a diferentes  aplicaciones de capacidades de búsqueda a texto completo a través de una API web RESTful.

ElasticSearch está desarrollado en Java y está publicado como código abierto bajo las condiciones de la licencia Apache.

Características de ElasticSearch

  • Motor de búsqueda OpenSource
  • Escrito en Java
  • Basado en Apache Lucene
  • Permite Arquitectura: distribuida, escalable, en alta disponibilidad
  • Capacidades de búsqueda y análisis en tiempo real mediante peticiones GET
  • Útil para soluciones NoSQL (sin transacciones distribuidas)
  • Permite utilizarlo sobre el ecosistema Hadoop para proyectos de BigData
  • API RESTfull sobre http para consulta, indexación, administración en diferentes lenguajes
  • Permite múltiples índices en un cluster, así como alias de índices
  • Permite consultas sobre uno o varios índices
  • Full Text Search o búsqueda por texto completo
  • Indexa todos los campos de los documentos JSON (sin esquema rígido)
  • Búsquedas mediante ElasticSearch Query DSL (Domain Specific Language): multilenguaje, geolocalización, contextual, autocompletar, etc

 

¿Porque utilizar ElasticSearch?

A diferencia de otros motores de búsqueda y recuperación de información, ElasticSearch actúa como repositorio de información, almacenando los documentos que indexa. Esto permite reemplazar almacenes de documentos como MongoDB o Raven DB por ElasticSearch en nuestros proyectos, si lo consideramos necesario.
Tanto MongoDB como ElasticSearch son repositorios de documentos desnormalizados en los que los documentos que gestionan no necesitan disponer de un esquema rígido para poderlos introducir en el sistema.

Las Bases de Datos relacionales (SQL) requieren definir las tablas, o esquema de la información, antes de poder introducir registros de datos. Esto hace que se tenga que pensar muy bien la estructura de la información antes de comenzar a programar en un proyecto para evitar que se produzcan cambios, puesto que estos cambios representarían una migración de los datos a otro esquema o tenerlos que adaptar. Si disponemos de un volumen de datos muy grande, estaríamos hablando de un proceso muy lento y costoso.
Sin embargo, como ElasticSearch no requiere un esquema predefinido de los datos, la misma colección de documentos puede contener documentos de estructura diferente, permitiendo un desarrollo más ágil.
Por otro lado, los documentos almacenados en ElasticSearch están en formato JSON que son estructuras de datos más cercanas a las entidades que se manejan a nivel de negocio. Esto también facilita un desarrollo más ágil ya que el propio documento contiene todos los elementos de la entidad de negocio sin tener la necesidad de lanzar consultas complejas sobre una base de datos para obtenerlos y poderlos procesar posteriormente.
Por otro lado, mediante su RESTful API este motor de búsqueda será ideal para realizar cualquier integración con otras tecnologías en nuestro proyecto.

Como se puede ver en la url anterior, ElasticSearch organiza la información en colecciones de documentos o Índices (index) y Tipos de Documentos (Type). En este ejemplo, dentro del índice “places” podríamos tener diferentes tipos de documentos como “restaurant”, “museum”, “hospital” o “airport”.
Un ejemplo de restaurante en formato JSON podría ser:

{«address»: {«building»: «469»,
«coord»: [-73.961704, 40.662942],
«street»: «Flatbush Avenue»,
«zipcode»: «11225»
},
«borough»: «Brooklyn»,
«cuisine»: «Hamburgers»,
«grades»: [{«date»: {«$date»: 1419897600000}, «grade»: «A», «score»: 8},
{«date»: {«$date»: 1404172800000}, «grade»: «B», «score»: 23},
{«date»: {«$date»: 1367280000000}, «grade»: «A», «score»: 12},
{«date»: {«$date»: 1336435200000}, «grade»: «A», «score»: 12}],
«name»: «Wendy’S», «restaurant_id»: «30112340»
}

ElasticSearch es un motor de búsqueda que se puede configurar en alta disponibilidad, y que a su vez es altamente escalable. Se organiza en una estructura de cluster en el que cada nodo del mismo almacena y gestiona un subconjunto del total de la información del sistema (fragmento de un índice), permitiendo paralelizar las tareas de búsqueda y recuperación de información. Esto permite abordar proyectos de BigData con grandes volúmenes de documentos en los que las capacidades de búsqueda rápida, y análisis, sean necesarias.

Para comenzar a utilizar un motor de búsqueda tenemos que abordar, como mínimo, las siguientes fases:

1.- Instalación / Configuración
2.- Indexar documentos
3.- Realizar consultas

Instalación / configuración de ElasticSearch:

A continuación se explican los pasos a seguir para realizar una instalación muy sencilla de ElasticSearch, y las de donde obtener el software:

  • Obtener el software de ElasticSearch desde la url oficial del producto, posteriormente descomprimirlo en un directorio.
  • Para poderlo ejecutar necesita tener instalado Java JRE y configurada la variable de entorno JAVA_HOME
  • Antes de arrancar ElasticSearch recomiendo modificar el fichero config/elasticsearch.ylm para cambiar el nombre del cluster por defecto, evitando que cualquier otra instalación por defecto en la misma red se una a nuestro cluster.

Cambiar la línea: #cluster.name: my-application
Por la línea: cluster.name: DavinciPrueba

  • Arrancar ElasticSearch ejecutando el script:

set  JAVA_HOME=»C:\Program Files\Java\jre8″
cd  bin
elasticsearch.bat

  • Una vez arrancado, si nos conectarnos con el navegador a http://localhost:9200/ observaremos una respuesta parecida a la siguiente, verificando que ya está todo listo para empezar!!!

{
«name» : «Shooting Star»,
«cluster_name» : «DavinciPrueba»,
«version» : {
«number» : «2.3.3»,
«build_hash» : «218bdf10790eef486ff2c41a3df5cfa32dadcfde»,
«build_timestamp» : «2016-05-17T15:40:04Z»,
«build_snapshot» : false,
«lucene_version» : «5.5.0»
},
«tagline» : «You Know, for Search»
}

Indexar documentos

Para poder indexar un documento, necesitamos hacer uso de la API RESTful enviando el documento por http al servidor ElasticSearch que acabamos de levantar. Para ello haremos uso de una herramienta “Fiddler Web Debugger

Después de ejecutar Fiddler, pulsamos sobre la pestaña “Composer”, fijamos el método POST y escribimos la llamada a http://localhost:9200/places/restaurant, fijando como cuerpo de la petición el documento JSON que describe un restaurante en el ejemplo anterior. Por el hecho de poner un método POST, cuando pulsamos sobre el botón “Execute”, estamos enviando el documento JSON al servidor de ElasticSearch para ser indexado.

La documentación de la API la podemos encontrar en:
https://www.elastic.co/guide/index.html

Os podéis descargar un DATASET de restaurantes

Os podéis descargar Fiddler Web Debugger

Realizar consultas

Para finalizar este post, haremos una query al motor de búsqueda de forma que recuperemos el documento introducido. Seguiremos utilizando la herramienta “Fiddler Web Debugger” para enviar un documento JSON con la query o consulta a realizar.

Lo primero que haremos será añadir la operación a realizar “_search” a la URL de llamada de la siguiente forma: http://localhost:9200/places/restaurant/_search, con esto estamos restringiendo la búsqueda al índice “places” y al tipo de documentos “restaurant”, solicitándole al motor de búsqueda que nos retorne todos los documentos indexados de ese tipo mediante la consulta

{ «query»: { «match_all»: {} } }

Por tanto al pulsar sobre el botón Execute, lanzaremos la operación sobre nuestro servidor ElasticSearch, y este nos retorna los resultados:

Para visualizar los resultados debemos hacer click sobre la respuesta del servidor ElasticSearch (subrayada en amarillo en la imagen anterior).
Podemos observar que coincide con el documento que hemos enviado a indexar, puesto que es el único documento indexado en el índice.
Con este post hemos sentado las bases de conocimiento necesarias para poder seguir avanzando en el uso de este tipo de tecnologías