Apache Lucene y Solr, Búsqueda sencilla y poderosa

¿Alguna vez han considerado que es irónico de que la funcionalidad más importante y útil del web es la búsqueda, no existe una solución común para agregar capacidad de búsqueda a las aplicaciones web?La mayoría de las aplicaciones simplemente utiliza la funcionalidad básica que provee el motor de base de datos que estén utilizando. Aquellas aplicaciones que requieren un sistema de búsqueda más complejo y flexible típicamente deben recurrir a productos comerciales, o desarrollar una solución desde cero. Afortunadamente esto ya no será necesario, ya que el proyecto Apache Lucene nos brinda una solución de búsqueda sofisticada y flexible que provee capacidades que compiten con las de los productos comerciales.

Lucene es un motor de búsqueda de alto desempeño escrito en Java. Está diseñado y desarrollado de tal forma que se pueda utilizar en prácticamente cualquier aplicación que requiera búsqueda de texto completo, especialmente aplicaciones multiplataforma.

En esencia, Lucene es una librería que puede ser invocada desde aplicaciones Java para realizar búsquedas. Pero si lo que queremos es una funcionalidad de mayor nivel, y donde no necesariamente tengamos que usar Java, podemos recurrir a Solr. Solr es un servidor de búsqueda basado en Lucene, que provee funcionalidad de más alto nivel, como:
• APIs para XML/HTTP y JSON
• Resaltar resultados
• Cache
• Replicación

Dedicaré el resto de este artículo a explicar como instalar y utilizar una solución de búsqueda utilizando Solr.

1. Instalación de Solr
Para ejecutar Solr requerimos tener instalado un JDK 1.5 o posterior.

Teniendo instalado nuestro JDK, simplemente descargamos la versión más reciente de Solr de http://mirror.x10.com/mirror/apache/lucene/solr/ y extraemos el contenido en nuestra computadora.
Solr se puede ejecutar en cualquier contenedor de Servlets como Tomcat o Jetty. Por simplicidad, para este ejemplo utilizaremos una versión de Jetty que viene incluida en el directorio de ejemplos de Solr. Para arrancar Solr simplemente entramos al directorio examples y ejecutamos el comando:
java -jar start.jar

Esto inicia una instancia de Jetty en el puerto 8983 de nuestra máquina, así que si todo salió bien, debemos poder entrar a http://localhost:8983/solr/admin/ y ver el panel de administración de Solr.

2. Definiendo la estructura de la información
Ya tenemos andando nuestro servidor Solr. Sin embargo, no tenemos datos, por lo que cualquier búsqueda que hagamos regresa 0 resultados. Para agregar datos a Solr primero debemos definir la estructura de la información que indexaremos y almacenaremos para búsqueda.

Al igual que la mayoría de las aplicaciones en Java, la configuración de Solr se guarda en archivos XML. El esquema XML que contiene la definición de la estructura de datos para indexar y almacenar está en el archivo solr/conf/schema.xml.

En schema.xml se definen los campos que tendrán nuestros elementos de información. Para cada campo se puede especificar si se debe indexar (para que se pueda utilizar en búsquedas) y si se puede almacenar (para que se pueda obtener la información localmente). Si la información a buscar está almacenada en una base de datos, puedes indicar a Lucene que indexe los campos, pero que no los almacene. A fin de cuentas, mientras almacene la llave primaria de cada elemento, el documento se puede reconstruir directamente desde la base de datos. Esto reduce fuertemente los requerimientos de almacenamiento de Lucene, y evita duplicar datos.
La sección es donde se listan los diferentes elementos tipo , es decir, los campos de información. Cada tiene un nombre que se utiliza como referencia al agregar documentos o realizar búsquedas, y un que identifica el tipo de datos. Los tipos de datos son declarados utilizando elementos . Los tipos de datos estándar en la configuración de ejemplo (text, boolean, sint, slong, sfloat, sdouble) son suficientes para la mayoría de las aplicaciones.

El siguiente listado muestra el contenido de los campos definidos para un ejemplo de un catálogo de productos:

required=”true”/>
stored=”true” omitNorms=”true”/>

stored=”true” omitNorms=”true”/>
stored=”true” multiValued=”true”/>

Las búsquedas enviadas a Lucene utilizan un solo campo, el cual se especifica utilizando el elemento . Dado que el objetivo en la mayoría de los casos es buscar en base a los valores de múltiples campos, lo que se hace es crear un campo adicional que sirva de sombrilla para contener el valor de todos los campos que queremos que sean incluidos en la búsqueda. El valor de los campos originales se copia utilizando el elemento . Un esquema de configuración de Solr puede contener un número ilimitado de declaraciones . Lo que hacen es indicarle a Solr que copie los datos de un campo especificado por el atributo “source” a otro campo especificado por el atributo “dest”.

El siguiente listado muestra un ejemplo de cómo definiríamos un campo múltiple para el catálogo de productos. Definimos un campo llamado “texto” que es el que utilizaremos para buscar, y que contendrá los valores de nombre, fabricante y características.

3. Agregando documentos a indexar
La forma de alimentar datos a Lucene es a través de documentos XML que contienen instrucciones de indexado para agregar, borrar o actualizar documentos. El siguiente listado muestra un ejemplo del XML a través del cual agregaríamos un nuevo elemento de información. Vean que los campos de información consisten con los que definimos en schema.xml.

3007WFP
Dell Widescreen UltraSharp 3007WFP
Dell, Inc.
30” TFT active matrix LCD, 2560 x 1600, .25mm dot pitch, 700:1 contrast
401.6
5199

El directorio exampledocs contiene ejemplos de instrucciones que Solr puede recibir, así como una utilería en Java (post.jar) para alimentar instrucciones a Lucene desde la línea de comandos.

4. Realizando búsquedas
Las búsquedas se realizan a través de peticiones por HTTP GET en el url /solr/select del servidor donde estés ejecutando Solr. El query de búsqueda se pasa a través del parámetro “q”. Es posible agregar parámetros adicionales para controlar la información que se obtiene. Un url con un query sencillo se vería de la siguiente forma: http://localhost:8983/solr/select?q=monitor

Solr regresa los resultados en forma de XML, así que es posible manipularlos como queramos. Incluso podemos utilizar Solr directamente utilizando un objeto XMLHttpRequest y manipular los resultados con Javascript.

Conclusión
En este artículo apenas echamos un pequeño vistazo a Lucene y Solr. Estas tecnologías son muy flexibles y nos proveen una amplia gama de posibilidades. De hecho, a quienes les interese hacer un ejercicio más sofisticado les recomendamos buscar en Internet los tutoriales que enseñan como utilizar Solr en conjunto con el API de Digg para poder realizar búsquedas de los contenidos de Digg usando Solr.

Ahora que conocen estas tecnologías, esperamos que las tengan en cuenta la próxima vez que requieran incorporar funcionalidad de búsqueda en sus aplicaciones.

Referencias:
• lucene.apache.org
• lucene.apache.org/solr