Elasticsearch: toma de contacto
Ya os contamos que estuvimos probando el Full-text search de MySQL en otro post. Para poder comparar mejor también le dimos un vistazo a Elasticsearch, recomendación que nos hicieron desde JOOPbox.
Elasticsearch es un motor de búsqueda, basado en Lucene, que también nos brinda la habilidad de full-text search. Guarda la información en formato JSON. Sus principales puntos fuertes son:
- Muy rápido, casi instantáneo.
- Proporciona un sistema de puntuación asociado a cada resultado de la búsqueda, como los full-text search de otros lenguajes SQL.
- El servicio es accesible via API Rest y devuelve todo en formato JSON. Es fácil construir un cliente en cualquier lenguaje de programación.
- Es muy fácil de escalar.
Para nuestras pruebas usamos Laravel y probamos unas cuantas librerías específicas para conectar el framework con Elasticsearch. En cualquier caso, los pasos básicos para empezar a usarlo son más o menos siempre los mismos.
Instalación
La parte más sencilla. Si seguimos las instrucciones oficiales nos podemos bajar un tar (o zip para esos locos que aún programan usando windows), lo desempaquetamos, y ya solo nos hace falta ejecutar el binario de elasticsearch.
Nos lanzará toda una serie de mensajes, cuando acabe podemos acceder via curl o navegador a http://localhost:9200/
Crear el índice
En elasticsearch un índice es una especie de espacio en donde se organizan los datos. La mejor forma de explicarlo es comparándolo con el mundo relacional. Un índice equivaldría a una base de datos.
Para crearlo tenemos varias opciones, dependiendo de qué librerías usemos. Para que el post sea más agnóstico a cualquier lenguaje, haremos todo con curl:
En este caso hemos creado el índice llamado store. Podemos comprobar que todo ha ido bien yendo a http://localhost:9200/store.
Mapear los datos
El siguiente paso consiste en decirle a elasticsearch como guardará y qué campos contendrá cada documento. Aquí entran en juego los types y los fields. Lo que en lenguaje “sql relacional” llamaríamos tablas y columnas. Siguiendo el ejemplo de la tienda podríamos definir el tipo producto con el campo nombre, descripción y un precio:
Esto lo que hace es crearnos el tipo product, en el índice store, asociándole un mapeo. Podemos comprobar el resultado en http://localhost:9200/store/product/_mapping?pretty
Indexar los datos
El último y definitivo paso es tener datos sobre los que hacer la búsqueda. La mayoría de librerías para integrar Elastisearch en tu proyecto tienen algún proceso de indexación de datos. Es decir, toda la información que tienes normalmente en tu base de datos relacional, la traspasas a los documentos JSON de Elasticsearch.
Para nuestro ejemplo lo que haremos será utilizar la api y meter algunos datos de productos:
Realizar búsquedas
Ahora ya tenemos un par de datos para ver como se realizan las búsquedas. De entrada, podemos ver todos los datos que hemos metido haciendo una búsqueda sobre el índice store, sin especificar ningún filtro:
Elasticsearch nos permite realizar una búsqueda tan compleja como queramos. Aquí puedes consultar todas las posibilidades. Lo que realmente nos interesa es ver que son muy rápidas y que nos devuelven los resultados ordenados por un campo score que nos facilitará filtrar mejor los resultados y mostrar los que más puedan interesar. A modo de ejemplo, podemos ver el resultado de buscar por “mouse button“
Nos encuentra dos resultados. Ordenados por un campo score en orden descendente. El que tiene un mayor resultado primero. Si nos fijamos tiene bastante sentido que uno esté por encima del otro. El primero contiene en el campo name las dos palabras por las que buscamos. El segundo solamente contiene la palabra mouse
Conclusiones
Bueno, el ejemplo usado en este artículo es meramente didáctico. No creo que nadie crease una tienda en elasticsearch, al carecer de transaccionalidad. La intención es más la de ver los pasos básicos para poder usar full-text search con elasticsearch con las ventajas mencionadas al principio del artículo.