Archivos mensuales: agosto 2017

autocomplete

Crear su propio motor de búsqueda con elasticsearch

En este artículo enseñamos cómo crear un motor de búsqueda rápido capaz de búsqueda de texto profundo, trabajando con terabytes de datos utilizando elasticsearch.

Vamos a construir un motor de búsqueda basado en la categoría de wikipedia «living persons», almacenar los datos en elasticsearch, probar la velocidad y la relevancia de nuestras consultas y también crear una consulta de autocompletado.

Requisitos previos

Ya tienes elasticsearch y kibana instalado.

Instalar Pywikibot

Pywikibot permite descargar el contenido de artículos de wikipedia.  Si tienes acceso a otra fuente de datos,  puede utilizarlo en su lugar.

Instrucciones para instalar el pywikibot están aqui : https://www.mediawiki.org/wiki/Manual:Pywikibot

Configurar pywikibot para usar  wikipedia.

Esto se hace ejecutando el script de configuración de pywikibot

Python pwb.py generate_user_files

El script es interactivo y permite definir el tipo de wiki que quieras.  En nuestro caso, elegimos wikipedia.

Instalar bibliotecas de Python
PIP instalar elasticsearch
Crear un mapping en Elasticsearch

El mapping define qué tipo de datos se guardan en cada campo, y cómo debe ser indexada.

El siguiente comando se puede pegar directamente en la consola Kibana Dev Tools

Esto crea una asignación de tipo de documento «wiki_page» en el índice «wikipeople» con cuatro categorías de texto ( url, título, categorías, texto) y un campo especial llamado «suggestion» que se utilizará para la función de autocompletar (explicamos más adelante).  Tenga en cuenta también que hemos especificado que el campo de texto utiliza un analizador de lengua inglesa.   (en lugar de francés, español o cualquier otro idioma).

Crear script  Pywikibot

En el directorio donde se instaló Pywikibot, encontrará un subdirectorio «/ pywikibot/core/scripts»

En el directorio de scripts se debe crear un nuevo script llamado wikipeopleloader.py

Se puede ejecutar el script utilizando la instrucció siguiente  (desde directorio/pywikibot/core)

Python pwb.py wikipeopleloader.py

La salida de la pantalla indicará  si hay algun error.  Si todo va bien, veremos cómo el script descarga las páginas de wikipedia y los carga en la base de datos de elasticsearch.   La velocidad de descarga depende de tu conexión a internet-  en mi caso una o dos páginas por segundo.  Para realizar las pruebas puedes abortar el proceso (ctrl Z) después de 60 segundos.

Ejemplo de consulta Elasticsearch para motor de búsqueda

A continuación encontrará una consulta y parte de su respuesta.

La parte de «source» de la consulta especifica que datos queremos excluir de la respuesta para reducir su tamaño.

La consulta busca «american football bearcats» en el título, categoría y cuerpo del texto.  Sin embargo da mayor peso a la valoración (score) si estos términos se encuentran en el campo  «categoría» o «título» (según lo determinado por los valores de «boost» en la consulta).

La consulta «highlight» devuelve el detalle de donde se ha encontrado el término de búsqueda.   Esto se puede ver en la respuesta con la etiqueta «highlight».  De esta manera es fácil mostrar el contexto del término de búsqueda al usuario para que pueda valorar si le interesa los resultados.

Sugerencias de autocompletar usando ElasticSearch y Jquery

En nuestro  mapping creamos un campo especial llamado «suggest» basado en el título de la página.  Esto nos permite mostrar una propuesta de  «Autocompletar» a la medida que el usuario vaya introduciendo el texto.   Consultas de tipo autocompletar estan optimizadas para esta finalidad.    Se ve un ejemplo de esta consulta a continuación:

En nuestro caso, la consulta devuelve sugerencias cuando el título de la página comienza con las letras que hemos introducido en nuestra consulta.    Esto nos permitiría crear la funcionalidad autocompletar en una página web  con jquery o similar.