Escuelita de Scala - Parte 4a - ElasticSearch
Escuelita de Scala
- Parte 1 - Instalación
- Parte 2 - Configuración de Play Framework
- Parte 3 - Play MVC
- Parte 3a - Vistas
- Parte 4 - Modelos y servicios
ElasticSearch es un componente similar a Apache Solr pero más compacto y sin esquema (schemaless), lo cual permite indexar y buscar en segundos. El API de ElasticSearch es un poco confuso, pero ya cuando se comprende como se asemeja al motor de ElasticSearch Lucene, codificar aplicaciones de busqueda es realmente sencillo y efectivo a la hora de implementar con interfaz de JavaScript / JSON.
Otro aspecto adicional de ElasticSearch es que es distribuido, asi que es posible tener varios nodos. En nuestro escenario, ElasticSearch funciona solo para buscar los datos, pero en teoria podria reemplazar MongoDB por completo.
Instalación
Descargar de ElasticSearch y extraer el contenido a una carpeta. Dentro de bin ejecutar el batch file elasticsearch.bat. Si no funciona revisen su JAVA_HOME, debe estar configurado adecuadamente. Adicionalmente puedes instalar el snapshot de datos en la carpeta data (reemplazar usando copy y paste).
ElasticSearch escucha en el puerto 9200 locamente. Para probar que los datos esten configurado correctamente, ejecute el siguiente URL. Debe retornar 422 registros.
http://localhost:9200/regpub/sa/_search?q=_all:martinelli&pretty=true
Typeahead (autocomplete)
El primer servicio consta de una busqueda de empresas o sociedades, estas deben cargarse dinamicamente en un textbox y al clickearse deben retornar la empresa. Bootstrap ofrece un control de Typeahead (busqueda adelantada seria la traducción), el cual utiliza una fuente de datos un array de JavaScript.
Lo primero que realizamos es implementar typeahead en SearchService. El cliente de ElasticSearch lo usamos igual que una conexión de base de datos, debemos abrir y cerrar la conexión para evitar problemas con el servicio (en el robot no la cerramos ya que solo indexamos de un modo masivo).
Para crear consultas, QueryBuilders contiene los diferentes tipos de consultas. El más sencillo y fácil de implementar es QueryBuilders.queryString. En este configuramos algoritmos y propiedades a usar. autoGeneratePhraseQueries = true tokeniza una sentencia en sus palabras individuales. En este mismo objeto asigamos el peso o “boost” a cada campo que se quiere analizar. Tambien podemos configurar el operador para consultas entre palabras (por ejemplo Juan AND Carlos o Juan OR Carlos).
Con el builder completo, preparamos la consulta con client.prepareSearch, asignamos el nombre del indice a buscar, el tipo de consulta, el query builder en setQuery y los campos a retornar.
Finalmente, solo retornamos los primeros 10 resultados, los cuales se convierten a JSON y se navega para solo retornar el contenido de hits.
En RegPubServices preparamos un json que retorne un array de item, esto después lo transformamos en un array puro usando Underscore y Backbone. Seguramente existe una forma más rápida, pero queriamos probar el uso de Underscore a nivel de cliente. Más adelante revisamos como el código de cliente implementa correctamente el Typeahead.