¿Qué es Hibernate Search?

¿Qué es Hibernate Search?
Photo by fabio / Unsplash

En este post exploraremos Hibernate Search, cubriremos un poco de la teoría para poder mejorar el rendimiento de las búsquedas y empezaremos explicando que es Hibernate.

Hibernate es uno de los ORM's más populares que existen en Java y se utiliza para interactuar con la base de datos, utilizando objetos en lugar de escribir consultas de SQL directamente. Además, simplifica la administración de transacciones, no confundir con Hibernate Search.

Las búsquedas

Hibernate nos va a ayudar a integrar Java y SQL, pero aun así arrastraremos los problemas de hacer búsquedas de texto en bases de datos relacionales, por ejemplo:  

  • Lentitud en las consultas: las consultas que involucran búsquedas de texto pueden ser más lentas debido a la naturaleza compleja de la búsqueda.
  • Sensibilidad a mayúsculas y minúsculas: significa que una búsqueda de "casa" no encontrará resultados para "Casa" o "CASA".
  • Faltas de ortografía y errores tipográficos: si ingresa un parámetro con faltas de ortografía o un error tipográfico, es posible que no arroje los resultados esperados.

Podemos encontrar que los últimos 2 puntos son un problema de la técnica de búsqueda que utiliza SQL, porque sus motores están diseñados principalmente para buscar datos estructurados en tablas y realizar operaciones como filtrado, agrupación y unión de datos basados en valores de campos numéricos o de fechas.

Para buscar texto nos ayudará mucho una técnica llamada búsqueda difusa, la cual se utiliza en páginas estilo Google o Amazon, poco a poco esta funcionalidad se ha ido integrando en las bases de datos SQL y NoSQL.

¿Qué es una búsqueda difusa?

Nos permite buscar palabras incluso si no están escritos exactamente de la misma manera. En lugar de encontrar coincidencias exactas, la búsqueda difusa encuentra términos que son similares en ortografía o pronunciación.

Un ejemplo de búsqueda difusa sería "color" y obtener resultados que incluyan "colores", "colored", "colorido", etc.

Ahora que conocemos la búsqueda difusa necesitamos implementarla, pero crearla desde cero será un problema para los equipos de desarrollo y aquí es donde entra Lucene.

Ya sé que se llama Lucille, pero se escucha muy similar al pronunciar Lucene

¿Qué es Lucene?

Lucene es una librería que nos permite usar la búsqueda de texto(full text search) escrita en Java. Lucene escanea el texto y lo almacena en índices, una estructura de datos optimizada para su posterior búsqueda.

También implementa la búsqueda difusa y admite consultas booleanas, entre muchas otras utilidades.

Si bien es una gran librería, me preocupa que no existan más alternativas en el mundo de Java, en el caso de los ORM's además de Hibernate, tenemos MyBatis o EclipseLink.

Esta librería es el core de proyectos exitosos en el desarrollo del software como:

  • Solr
  • Elasticsearch
  • Nutch
  • Hibernate Search

Y cualquiera de ellos nos podría ayudará a implementar las bondades de Lucene, pero por ahora nos concentraremos en Hibernate Search y Elasticsearch.

Hibernate Search es una librería que extiende las capacidades de Hibernate para permitirnos implementar las búsquedas de texto de Lucene con "poco código", además de administrar la sincronización de los índices con los datos en tiempo real.

Es decir, que Hibernate Search se aprovecha de que Hibernate ya tiene el acceso a tus datos en SQL y los envía a Lucene para crear sus índices y habilitar nuevas operaciones de búsqueda de texto.

diagrama

Ahora, si por cualquier razón creemos que Lucene no es suficiente para nosotros, es posible agregar una capa más de abstracción, haciendo que Hibernate Search utilice Elasticsearch como motor, aunque al final internamente seguiremos usando Lucene.

Esta integración con Elasticsearch puede parecer redundante, pero te abre las puertas a otras funcionalidades y herramientas del stack de Elasticsearch como Kibana.

elasticsearch

Mi experiencia con Hibernate Search comenzó en 2015, cuando empecé a trabajar en una empresa que ya tenía esta tecnología implementada en uno de sus proyectos. El stack tecnológico que utilizábamos incluía Weld como implementación de CDI, Hibernate para JPA y RichFaces como capa para JSF. En ese momento, estábamos en pleno proceso de migración a RichFaces 5 cuando recibimos la noticia de que se cancelaba RichFaces. Corríamos la aplicación en WildFly 8 y utilizábamos JBoss Developer Studio como IDE, un stack tecnológico para personas rudas de concreto puro.

La implementación que usábamos permitía subir documentos a una página, desde donde se extraía todo el texto con Apache Tika. Posteriormente, el contenido se insertaba en una base de datos mediante Hibernate, el cual a su vez se comunicaba con Hibernate Search. La principal ventaja de esta funcionalidad era que los usuarios podían buscar en el contenido de todos los documentos subidos a la plataforma al mismo tiempo, encontrarlo y descargar el archivo.

Personalmente, esta funcionalidad me pareció muy interesante y disfruté mucho comprendiendo como trabajaba, qué buenos tiempos.

Conclusión


Hibernate Search es una herramienta muy útil para cualquier proyecto que requiera búsquedas de texto y que desee implementarla de forma rápida y sencilla, en el siguiente post haremos un ejemplo, este fue solo teórico y no quiero hacerlo más largo.

Fuentes