Integración de Elasticsearch con Spring + MySQL

En este tutorial veremos los pasos a seguir para ver cómo podemos integrar Elasticsearch en un proyecto con Spring + MySQL.

0. Índice de contenidos

1. Introducción

Elasticsearch es un servidor de búsqueda basado en Apache Lucene. Provee un motor de búsqueda de texto completo, distribuido y con capacidad de multitenencia con una interfaz web RESTful y con documentos JSON. Elasticsearch está desarrollado en Java y está publicado como código abierto bajo las condiciones de la licencia Apache.

Los motores de búsqueda nos permiten la búsqueda y acceso a información indexada de forma instantánea, que de otra forma supondría una gran penalización en tiempo y en rendimiento. Un ejemplo típico de uso sería la búsqueda de artículos en un blog utilizando como patrón de búsqueda alguna frase significativa que pudiera aparecer con alta probabilidad en artículo que se pretende encontrar.

2. Entorno

El tutorial está escrito utilizando el siguiente entorno:
  • Hardware: MacBook Pro 15′ (2 Ghz Intel Core i7, 8GB DDR3 1333 Mhz)
  • Sistema operativo: Mac OS X Yosemite 10.10.3
  • Software
    • Java JDK 1.8
    • Maven 3
    • MySQL Server 5.6

3. Preparación de la MySQL con datos de prueba.

Para nuestro tutorial, vamos a utilizar la base de datos de pruebas de MySQL Sakila.

Accedemos a la web de descarga de MySQL Sakila a través del siguiente enlace y nos descargamos el ZIP de la base de datos sakila.

Descomprimimos el zip donde deseemos. Se nos habrá creado una carpeta ‘sakila-db’ que contendrá los ficheros ‘sakila-schema.sql’, y ‘sakila-data.sql’.

Abrimos un terminal y nos conectamos al servidor de MySQL con nuestras credenciales.

Ejecutamos el script ‘sakila-schema.sql’.

Ejecutamos el script ‘sakila-data.sql’.

Confirmamos que la base de datos se ha creado y poblado correctamente.

4. Instalación y ejecución de Elasticsearch

El único requerimiento necesario para poder utilizar Elasticsearch es una versión reciente de Java, preferiblemente, utilizando su ultima versión oficial liberada disponible en www.java.com.

Accedemos a la página de descarga y nos descargamos el .zip con las versión más actual. Después la descomprimimos en la ubicación que más nos guste (a partir de ahora $ELASTICSEARCH_HOME).

A continuación vamos a instalar el plugin “head” de Elasticsearch, el cual nos proporcionará una interfaz gráfica web del ecosistema Elasticsearch que hayamos arrancado.

Por último, arrancamos el Elasticsearch y verificamos que está arriba haciendo de nuestro plugin “head”.

Accedemos a http://localhost:9200/_plugin/head/ y vemos que está levantado.

5. Importación de datos a Elasticsearch

Para la importanción de los datos utilizaremos Elasticsearch JDBC Importer, el cual nos permite traernos todos los datos a través de conexiones JDBC a nuestra base de datos. Esto nos da la potencia de qué podremos recolectar datos de cualquier base de datos siempre y cuando tengamos nuestro conector JDBC.

5.1 Para la instalación

Descargamos el .zip con el Elasticsearch JDBC Importer.

Descomprimimos.

Nos dirigimos al directorio descomprimido (a partir de ahora $JDBC_IMPORTER_HOME).

Verificamos que la versión descargada tenga nuestro conector JDBC para MySQL en la carpeta “$JDBC_IMPORTER_HOME/lib”. Si no lo tuviera, se lo añadimos descargándonoslo de la comunidad oficial de MySQL.

Con esto concluirían los pasos para la instalación del Elasticsearch JDBC Importer. Vamos a ver la ejecución.

5.2. Para la ejecución

Antes de ejecutar la importanción, debemos tener definida la query que lanzara el JDBC Importer para extraer los datos.

Para nuestro ejemplo, vamos a indexar la información para que se pueda buscar por título del film y descripción del film. Para ello, debemos construir la siguiente query:

Con ella, vamos a construir el script de importación.

y lo editamos para que quede de la siguiente forma:

Atendiendo especialmente a la salida del comando ‘echo’.

  • type: Tipo de conexion.
  • dbc.url: URL de conexión JDBC.
  • jdbc.user: Usuario de la conexión JDBC.
  • jdbc.password: Password de la conexión JDBC.
  • jdbc.sql: Query SQL utilizada para la extracción de datos.
  • jdbc.index: Nombre del índice donde se indexará la información. Puede estar definido previamente en Elasticsearch.
  • jdbc.type: Nombre del mapping que tendrán los documentos indexados a través de la query construida.

Salvamos el documento, y le damos permisos de ejecución.

Por último ejecutamos el script teniendo en cuenta que el proceso de Elasticsearch ya tiene que estar arrancado previamente.

Accedemos a la web del plugin head, para verificar que se ha creado el índice.

6. Integración con Spring

Para la integración con Spring se utilizará la librería Spring Data Elasticsearch, disponible en el repositorio central de Maven.

6.1 Estructura general del proyecto

6.2 pom.xml

6.3 applicationContext.xml

6.4 FilmIndexedDoc.java

A destacar, que el nombre de los atributos de clase deben coincidir con los nombres de las propiedades del mapping de los films indexados.

Debemos atender a los alias explicitados en la query de importacion: “filmTitle”, “filmDescription”. Además, el nombre del índice y el nombre del tipo también deben coincidir con el del script de importación (“index” : “sakila_index_demo”, “type” : “film_type”).

6.5 FilmIndexedDocRepository.java

Definimos una interfaz que extienda de la interfaz ‘ElasticsearchRepository’ indicándole el objeto y el tipo del campo ‘_id’. Esta interfaz contendrá las firmas de los métodos que Spring Data Elasticsearch utilizará para construir las queries de forma transparente utilizando la notación CamelCase para los atributos ‘filmTitle’ y ‘filmDescription’.

6.6. FilmIndexedDocRepositoryTest.java

Por último, definimos un test de integración para ver que todo funciona correctamente.

7. Conclusiones

En este tutorial hemos visto la integración de Elasticsearch con Spring + MySQL. Para ello, nos hemos servido de la herramienta Elasticsearch Importer JDBC con la que hemos podido importar los datos de manera sencilla utilizando una query customizada a nuestras necesidades, y con la posibilidad de poder importar datos de cualquier fabricante de base de datos, siempre y cuando tengamos su conector JDBC. Para la integración con Spring, hemos utilizado la librería Spring Data Elasticsearch, la cual nos proporciona una serie de clases e interfaces templates para poder dedicar nuestro tiempo únicamente a los procesos de negocio de búsqueda en Elasticsearch.

Espero que este tutorial os haya servido de ayuda. Un saludo.

Daniel Rodríguez

Twitter: @DaniRguezHdez