Czytaj książkę: «Desarrollo de motores de búsqueda utilizando herramientas open source»
DESARROLLO DE MOTORES DE BÚSQUEDA
UTILIZANDO HERRAMIENTAS OPEN SOURCE
Análisis y desarrollo con Apache Lucene, Solr y ElasticSearch
José Manuel Ortega Candel
DESARROLLO DE MOTORES DE BÚSQUEDA
UTILIZANDO HERRAMIENTAS OPEN SOURCE
Análisis y desarrollo con Apache Lucene, Solr y ElasticSearch
José Manuel Ortega Candel
Desarrollo de motores de búsqueda utilizando herramientas open source
© 2021 José Manuel Ortega Candel
Primera edición, 2021
© 2021 MARCOMBO, S. L.
Diseño de cubierta: ENEDENÚ DISEÑO GRÁFICO
Maquetación: D. Márquez
Corrección: Nuria Barroso y Anna Alberola
Directora de producción: M.a Rosa Castillo Producción del ePub: booqlab
«Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra solo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a CEDRO (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra».
ISBN: 978-84-267-3336-8
Este libro va dedicado a aquellos que me han seguido, me siguen y me seguirán, no importa cuál sea el camino escogido, en algún lugar nos encontraremos.
ÍNDICE
INTRODUCCIÓN
CAPÍTULO 1
INTRODUCCIÓN A LOS MOTORES DE BÚSQUEDA
1.1 Definición de motores de búsqueda
1.2 ¿Por qué necesito un motor de búsqueda?
1.2.1 Extracción de texto en documentos
1.2.2 Operaciones de lectura
1.2.3 Esquema flexible
1.3 Funcionamiento de un motor de búsqueda
1.3.1 Buscadores de directorios
1.3.2 Buscadores jerárquicos
1.3.3 Spiders (arañas o crawlers)
1.4 Proceso de indexación
1.4.1 Rendimiento en la indexación de documentos
1.4.2 Stopwords
1.4.3 Steamming
1.5 Recuperación de la información
1.5.1 Extracción de información
1.5.2 Sistema de búsqueda/respuesta
1.6 Motores de búsqueda e indexadores
1.6.1 Lucene
1.6.2 Índice invertido
1.6.3 Apache Solr
1.6.4 ElasticSearch
1.6.5 Otros motores de búsqueda
1.7 Herramientas de procesamiento de lenguaje natural (PLN)
CAPÍTULO 2
APACHE LUCENE
2.1 Introducción a Apache Lucene
2.2 Módulos y funcionalidades de Apache Lucene
2.3 Arquitectura de Apache Lucene
2.3.1 Proceso de tokenización y búsqueda en Apache Lucene
2.4 Trabajar con Apache Lucene
2.4.1 Configuración del entorno
2.4.2 Crear un índice
2.4.3 Crear y escribir documentos en un índice
2.5 Realizar búsquedas en Apache Lucene
2.5.1 Obtención de un IndexSearcher
2.5.2 Proceso de búsqueda con IndexSearcher
2.5.3 Crear consultas con Lucene QueryParser
2.5.4 Sintaxis de las consultas en Apache Lucene
2.6 Búsqueda de información con Apache Lucene
2.7 Búsqueda en múltiples índices de Lucene
2.8 Herramientas de administración de Lucene
2.9 Herramientas de búsqueda que usan Apache Lucene
2.9.1 Krugle
2.9.2 Google Dataset Search
2.9.3 Otros repositorios y portales
CAPÍTULO 3
APACHE SOLR
3.1 Introducción a Apache Solr
3.2 Arquitectura de Apache Solr
3.3 Indexación e índice invertido en Apache Solr
3.3.1 Relevancia y filtro en las búsquedas
3.4 Instalación de Solr
3.5 Configurar Apache Solr
3.5.1 Ficheros de configuración y esquema
3.5.2 Proceso de indexación
3.5.3 Indexación de datos con SimplePostTool
3.5.4 Esquema administrado en Apache Solr
3.5.5 Añadir información al índice
3.6 Búsqueda de documentos
3.6.1 Usar la API REST
3.6.2 Consultas básicas de Solr
3.6.3 Componente stats (estadísticas)
3.7 Consultas avanzadas de Solr
3.7.1 Paginación y clasificación
3.7.2 Navegación facetada en Solr
3.7.3 Búsqueda de facetas en Solr
3.8 Componentes de una petición en Solr
3.8.1 Controladores Request Handler
3.9 Analizadores en Apache Solr
3.9.1 Definir campos personalizados
3.9.2 Configuración de los tipos de campos
3.9.3 Propiedad score
3.10 Monitorización del rendimiento de Apache Solr
3.10.1 Página de plugins/estadísticas de Apache Solr
3.11 Ejecución en modo Cloud
3.11.1 Terminología usada en SolrCloud
3.11.2 SolrCloud
3.11.3 Ejecutar SolrCloud
3.11.4 Indexación distribuida
3.11.5 Ventajas de SolrCloud
3.12 Arrancar Apache Solr desde Docker
3.13 Interactuar con Solr desde Java
3.13.1 Añadir Solrj a un proyecto Maven
3.13.2 Conexión con el servidor Solr desde Java
3.14 Crawling con Apache Nutch y conexión con Apache Solr
3.15 Conclusiones de Apache Solr
CAPÍTULO 4
ELASTICSEARCH
4.1 Introducción a ElasticSearch
4.1.1 Ventajas de ElasticSearch sobre Apache Solr
4.2 Uso de ElasticSearch para proyectos de Big Data
4.3 Arquitectura de ElasticSearch
4.3.1 Nodos en ElasticSearch
4.4 ElasticSearch como solución distribuida
4.5 Fragmentos y réplicas en ElasticSearch
4.6 Instalación de ElasticSearch
4.7 Crear un índice en ElasticSearch
4.8 API REST de ElasticSearch
4.8.1 Mapping o estructura de los datos del índice
4.8.2 Recuperar parte de un documento
4.8.3 Asignar un mapeo a un índice
4.8.4 Query DSL (solicitudes DSL)
4.8.5 Búsquedas en ElasticSearch
4.8.6 La consulta multi_match
4.8.7 Navegación facetada en ElasticSearch
4.8.8 Agregaciones en documentos
4.8.9 Autocompletado en ElasticSearch
4.8.10 Analizadores en ElasticSearch
4.9 Relevancia de documentos en ElasticSearch
4.9.1 Puntuación y relevancia de los documentos
4.9.2 Mejorar la relevancia de los resultados de búsqueda
4.10 Estadísticas e información sobre el clúster, índices y nodos
4.10.1 Estado del clúster
4.10.2 Métricas del clúster
4.10.3 Estadísticas de los índices
4.11 Herramientas de monitorización en ElasticSearch
4.11.1 ElasticSearch Head
4.11.2 ElasticSearch query client
4.11.3 Cerebro
CAPÍTULO 5
CLIENTES ELASTICSEARCH
5.1 Clientes de conexión en Java
5.2 Conexión al clúster de ElasticSearch
5.3 Gestionar índices
5.4 Indexación de documentos en el índice
5.5 Búsqueda de documentos en el índice
5.6 Integración con Spring Data
5.7 Seguridad en ElasticSearch
5.8 Conclusiones de ElasticSearch
CAPÍTULO 6
VISUALIZACIÓN DE DATOS CON KIBANA
6.1 Introducción a Kibana
6.2 Stack ELK
6.2.1 Principales usos de ELK
6.2.2 Stack ELK en contenedores Docker
6.3 Instalación de Kibana
6.4 LogStash
6.4.1 Instalación de LogStash
6.4.2 Configuración de LogStash
6.4.3 Otros servicios de Elastic
6.5 Monitorización de LogStash desde Kibana
6.6 Seguridad en Kibana
CAPÍTULO 7
MOTORES DE BÚSQUEDA CON PYTHON
7.1 Conectando con Solr desde Python
7.2 Integración de ElasticSearch con Python
7.2.1 Crear un índice e insertar documentos usando Python
7.2.2 Realizar búsquedas usando Python
7.3 Consultar ElasticSearch a través de la API REST en Python
7.4 Optimizar un índice en ElasticSearch
7.5 Indexar documentación de Django
7.6 Whoosh como motor de búsqueda en Python
7.6.1 Whoosh schema
7.6.2 Realizar búsquedas en Whoosh y scoring
7.7 Django-haystack
7.7.1 Integrar haystack en una aplicación Django
CAPÍTULO 8
GLOSARIO DE TÉRMINOS
INTRODUCCIÓN
Este libro está especialmente pensado para perfiles con conocimientos previos en programación orientada a objetos, principalmente con los lenguajes de programación Java y Python. Va dirigido a aquellos perfiles con habilidades de programación que necesiten trabajar con motores de búsqueda open source y a quienes precisen llevar a cabo tareas orientadas a la extracción, procesamiento y manipulación de grandes volúmenes de datos no estructurados.
Analizaremos los principales motores de búsqueda de código abierto, como Apache Lucene, Solr y ElasticSearch. Este último es uno de los motores de búsqueda open source para Big Data con mayor crecimiento en la industria. Se caracteriza por sus grandes capacidades de flexibilidad, velocidad, escalado y herramientas de soporte asociadas, y recorre todo el ciclo de trabajo desde la construcción de los procesos de extracción e incorporación de datos hasta el trabajo de análisis y monitorización mediante herramientas de búsqueda y visualización en tiempo real con herramientas como Kibana.
A lo largo del libro, el lector encontrará ejemplos de código fuente en los lenguajes de programación Java y Python. Los scripts y proyectos implementados se pueden encontrar en el repositorio de GitHub:
https://github.com/Marcombo/motores_busqueda_open_source
A partir del capítulo 2, se recomienda al lector seguir los ejemplos prácticos del libro junto con el código fuente que se puede encontrar en el repositorio de GitHub, con el objetivo de practicar los conceptos que se analizan de forma teórica. En dicho repositorio también hallará instrucciones de instalación del entorno y de las principales herramientas a nivel de desarrollo que se utilizan a lo largo del libro.
Capítulo 1
INTRODUCCIÓN A LOS MOTORES DE BÚSQUEDA
En la actualidad, el empleo de motores de búsqueda se ha extendido de forma generalizada. Esto se debe principalmente a la proliferación de sitios web, a la evolución de los sistemas y a las necesidades de compartir documentos y realizar búsquedas en un mundo globalizado y digitalmente conectado. Cabe destacar que los motores de búsqueda se encuentran muy de moda en la actualidad, no solamente por su gran éxito en la red y por su capacidad para indexar documentos, sino también por su utilización en el mundo de las redes sociales y en las modernas técnicas y herramientas de Big Data.
Los motores de búsqueda solucionan la mayoría de los problemas que se presentan a la hora de realizar una búsqueda con una cantidad elevada de datos, y permiten obtener resultados relevantes para el usuario mediante algoritmos de ordenación.
En la actualidad, cuando se habla de motor de búsqueda, se tiende a pensar en la consulta web. En general, el impacto que ha supuesto la creación de Internet, junto con la necesidad de los usuarios de compartir información, ha llevado a la inevitable búsqueda de herramientas que faciliten el proceso de clasificación de documentos conforme a las necesidades del usuario. Además, la creciente cantidad de datos que encontramos en Internet necesita ser estructurada y clasificada de algún modo que permita su interpretación. En esencia, esta es la misión de un motor de búsqueda: permitir a los usuarios acceder, a través de un conjunto de palabras clave, a la información que desean, intentando presentar en primer término los datos más relevantes para el usuario.
Sin embargo, los motores de búsqueda no se emplean únicamente en Internet. Aunque ese fuera el origen de su nacimiento, en la actualidad se han convertido en poderosas herramientas para aportar soluciones de negocio (por ejemplo, para búsquedas internas en la documentación de las empresas, o para situaciones que requieran localizar información dentro de un gran volumen de datos).
De esta manera, los motores de búsqueda se han convertido en algo intrínseco en nuestro día a día. Es por ello que realizar un estudio analizando las semejanzas y diferencias entre diferentes motores de búsqueda puede resultar muy interesante.
Entre los principales objetivos de este capítulo podemos destacar:
• Comprender la estructura y naturaleza de un motor de búsqueda y la importancia de los sistemas de búsqueda y recuperación de la información para su implementación.
• Conocer las necesidades típicas que se resuelven mediante motores de búsqueda.
• Conocer los principales motores de búsqueda que podemos encontrar en el mercado.
1.1 DEFINICIÓN DE MOTORES DE BÚSQUEDA
En la actualidad, para agilizar el tiempo de respuesta en el proceso de búsqueda, se hace uso de motores de búsqueda que suelen utilizar palabras clave y metadatos que provienen de las mismas páginas para, de esta forma, obtener un vocabulario y mejorar la búsqueda en el sitio.
Los motores de búsqueda han recorrido un largo camino desde sus primeros prototipos, y su desarrollo ha llevado a la investigación de múltiples tecnologías de búsqueda, que se desarrollaron a partir de diferentes motores. Alta Vista fue el primer motor de búsqueda para procesar las consultas en lenguaje natural; y Lycos fue uno de los primeros motores de búsqueda en implementar un sistema de categorización a partir de la relevancia de las palabras, teniendo en cuenta los prefijos en palabras clave y la proximidad de las palabras encontradas.
Un motor de búsqueda es un software o una secuencia de comandos que busca en documentos o en bases de datos las palabras clave y devuelve los resultados de todos los archivos que contengan esas palabras. Hoy en día, existen muchos motores de búsqueda diferentes disponibles en Internet, cada uno con sus propias habilidades y características. El primer motor de búsqueda desarrollado fue Archie (https://es.wikipedia.org/wiki/Archie_(Buscador_FTP)), que fue utilizado para buscar archivos de forma similar al protocolo FTP. Hoy en día, el motor de búsqueda más popular es Google.
Al final, un motor de búsqueda como Google es un buscador jerárquico que va recorriendo páginas y recopilando información sobre su contenido. En el momento de realizar una consulta mediante frases o palabras clave, el motor de búsqueda reúne información de su base de datos y la muestra al usuario según la relevancia que cada motor pueda definir. Como resultado final, devuelve al usuario los resultados en un listado de páginas que contienen las palabras de la consulta realizada.
1.2 ¿POR QUÉ NECESITO UN MOTOR DE BÚSQUEDA?
En primer lugar, sería interesante analizar las preguntas que deberíamos responder sobre sus datos y los casos de uso para decidir si un motor de búsqueda sería lo más adecuado para el problema que trata de resolver. Al final, se trata de entender los datos y los usuarios y elegir una tecnología que funcione para ambos.
Una característica distintiva de las arquitecturas de aplicaciones modernas es hacer coincidir el motor de almacenamiento y procesamiento con los datos. Si es un programador, debe seleccionar la mejor estructura de datos en función de cómo se utilizarán los datos en un algoritmo. El mismo principio se aplica con los motores de búsqueda.
Los motores de búsqueda están optimizados para manejar datos que tienen las siguientes características:
• Extracción de texto en documentos
• Operaciones de lectura
• Orientación a documentos
• Esquema de documentos flexible a los cambios
Una posible quinta característica es la de tener un gran volumen de datos para tratar, es decir, Big Data. Pero sería interesante estudiar lo que hace que un motor de búsqueda sea especial para manejar grandes volúmenes de datos. Por ahora, nos centraremos en los conceptos de alto nivel.
1.2.1 Extracción de texto en documentos
Esta característica hace referencia a que un motor de búsqueda está específicamente diseñado para extraer la estructura implícita del texto a partir de la información que almacena en los índices. Los datos centrados en el texto implican que el texto de un documento contiene información que los usuarios están interesados en encontrar. Por supuesto, un motor de búsqueda también admite datos sin texto, como fechas y números, pero su principal ventaja reside en su capacidad de manejar textos basados en lenguaje natural.
1.2.2 Operaciones de lectura
Otro aspecto clave es que los motores de búsqueda manejan de manera efectiva la información en modo lectura y, por lo tanto, están optimizados para acceder con eficiencia a la información de los índices. Esto significa que las operaciones de lectura son más óptimas si las comparamos con operaciones de creación o actualización. Esto no quiere decir que no se puedan escribir grandes cantidades de datos o que existan límites sobre la frecuencia con la que se pueden escribir otros nuevos. De hecho, una de las características clave de los motores de búsqueda es la capacidad que tienen, casi en tiempo real, de indexar miles de documentos por segundo y hacer que se puedan buscar casi de inmediato.
El punto más importante es que cuando escribe datos en los índices de un motor de búsqueda, estos datos están destinados a ser leídos en algún momento y releídos muchas veces a lo largo de su vida útil. Piense en un motor de búsqueda como en una herramienta optimizada para ejecutar consultas, en lugar de almacenar datos. Además, si las operaciones de actualización van a ser más frecuentes que las operaciones de lectura, esto podría ser un indicador de que un motor de búsqueda podría no ser la mejor solución para sus necesidades. Existen otras tecnologías NoSQL, como MongoDB o Cassandra, que podrían ser mejores opciones si necesitara escrituras aleatorias rápidas de los datos existentes.
1.2.3 Esquema flexible
La última característica destacada de los motores de búsqueda es que tienen un esquema flexible. Esto significa que los documentos, en un índice de búsqueda, no necesitan una estructura uniforme. En una base de datos relacional, cada fila de una tabla tiene la misma estructura.
La mayoría de los motores de búsqueda se basan en que los documentos pueden tener diferentes campos y no hay una estructura fija. Piense, por ejemplo, en bases de datos NoSQL orientadas a documentos como Mongo-DB o CouchDB.
El beneficio de disponer de una variedad de opciones para almacenar y procesar datos es que no tiene que encontrar una tecnología única para todos. En la mayoría de los casos, podrá complementar el uso de motores de búsqueda tanto con bases de datos relacionales como con bases de datos NoSQL.