1. Introducción

Apache Solr es un potente motor de búsqueda de código abierto que permite indexar gran variedad de tipos de documentos entre los que se encuentran XML, JSON, CSV, Word, PDF… Entre sus características encontramos búsqueda de texto completo, búsqueda facetada, resaltado de resultados, clustering dinámico e integración con bases de datos.

Una de las principales ventajas de Solr es que las búsquedas pueden realizarse mediante simples peticiones REST, de modo que podemos realizar una consulta a través de una URL como:

http://localhost:8983/solr/gettingstarted/select?q=apellidos%3Alopez&sort=apellidos+desc&start=40&rows=20&wt=xml&indent=true&defType=dismax

Los resultados pueden obtenerse en forma de un documento estructurado como XML, JSON ó CSV. Pero también en otros diferentes formatos como un array de PHP.

Entre los usuarios de Apache Solr se encuentran grandes empresas como Apple, eBay, Cisco.

Los más populares gestores de contenido como Drupal, WordPress y Liferay tienen ya módulos o plugins de integración con Solr.

2. Instalación

Desde la versión 5 (disponible desde el 20 de Febrero de 2015) ya no se distribuye como un archivo war, que podía desplegarse en cualquier servidor de aplicaciones. A partir de esta versión Solr viene integrado en un servidor Jetty con una nueva interfaz de administración. Podemos descargarnos la última versión desde http://lucene.apache.org/solr/mirrors-solr-latest-redir.html desde donde se nos redirigirá a la página de descarga de la última versión, la 5.4.1 liberada el 23 de Enero.

Para ejecutar Solr 5.4.1 necesitará una versión de Java 7 o superior, evitando usar la construcción GA 147 y las actualizaciones u40, u45 y u51 de Oracle u OpenJDK. Para más información sobre ésta cuestión puede visitar Java Bugs in various JVMs affecting Lucene / Solr. Se recomienda el uso de la versión 8 que proporciona un mejor rendimiento.

Una vez realizada la descarga, descomprima el fichero en una carpeta de su elección.

3. Arranque

Para arrancar Solr utilizamos el script solr que se encuentra en la carpeta bin. Hay una versión de este script para los sistemas operativos Linux/Unix/OSX y otra para Windows. En cualquier caso basta con ejecutar

$ bin/solr start

Una vez el servidor esté en marcha podemos acceder a la interfaz gráfica de administración de Solr en http://localhost:8983/solr/

Para ver todas las opciones del script podemos ejecutar:

$ bin/solr -help

y para la opción start:

$ bin/solr start –help

No podemos terminar de hablar del arranque de Solr sin mencionar SolrCloud. SolrCloud es el nombre con el que se denominan una serie de funcionalidades añadidas a partir de la versión 4 para facilitar la administación de un cluster de servidores Solr para escalabilidad, tolerancia a fallos y alta disponibilidad. Para tener acceso a estas funcionalidades debemos arrancar el servidor Solr en modo SolrCloud:

$ bin/solr start -cloud

La descripción detallada de SolrCloud escapa al propósito de este artículo.

4. Indexado

Una vez el servidor Solr está en ejecución, lo primero que tenemos que hacer es crear un core, la estructura donde se guardará nuestro indice. Para ello ejecutamos:

$ bin/solr create -c <nombre_del_core>

Como ocurre con la opción start, podemos ejecutar:

$ bin/solr create -help

para obtener ayuda sobre las opciones disponibles para la creación de cores.

Si en un momento dado deseamos borrar un core podemos hacerlo con el comando delete:

$ bin/solr delete -c <nombre_del_core>

En la carpeta <solr_home>/server/solr se creará la carpeta de nuestro core que contendrá:

  • core.properties: define las propiedades del core como su nombre, la localización del archivo schema.xml y otros parámetros
  • conf/: contiene los ficheros de configuración. Los más importantes:
  • solrconfig.xml: contiene parámetros para definir el comportamiento del core a alt nivel, como una localización diferente para la carpeta data
  • schema.xml: define la estructura de los documentos a indexar. En este archivo se definen un documento como una serie de campos, que han de ser definidos a través de varios parámetros incluyendo su tipo. Al crear un core no encontraremos este fichero, sino uno llamado managed-schema que puede servirnos como punto de partida para crear nuestro propio schema.xml. También es posible trabajar en modo “schemaless”, de esta manera no hará falta editar el schema manualmente, sino que éste se irá creando a medida que vayamos indexando documentos. Para que nuestro core trabaje de esta forma es necesario configurar adecuadamente el fichero solrconfig.xml.
  • data/: esta carpeta contiene los ficheros de bajo nivel productos del proceso de indexado

Una vez creado el core tenemos que añadirle los documentos que queremos indexar.

Aunque son varios los métodos por los que podemos realizar esta tarea, incluyendo el uso de SolrJ, una API Java, aquí veremos el uso de post una sencilla herramienta de línea de comandos disponible únicamente para shell de Unix. Sin embargo post realiza su trabajo a través de un programa Java, SimplePostTool, que puede ser invocado desde sistemas Windows. Esta utilidad se encuentra incluida en el fichero post.jar de modo que podemos ejecutarla desde el directorio de instalación de Solr. Encontramos el fichero post.jar en la carpeta <solr_home>/example/exampledocs. Podemos moverlo por ejemplo a la carpeta bin y ejecutar desde <solr_home>

$ java -jar bin/post.jar -h

Si trabajamos en Linux/Unix/OsX, para el mismo propósito podemos hacer

$ bin/post -h

Y, por ejemplo, para indexar en el core de nombre productos todos los documentos de extensión pdf que se encuentren en la carpeta catalogo hacemos:

$ bin/post -c productos catalogo/*.pdf

5. Búsqueda

Cuando realizamos una petición a un servidor Solr, esta es procesada inicialmente por un request handler. En el caso de peticiones de búsqueda el request handler mandará la petición a un query parser, que es quien finalmente interpreta los términos y parámetros para el proceso de búsqueda. Cada query parser cuenta con una sintaxis propia si bien hay una serie de parámetros comunes a todos estos. Tres de estos parseadores son el “standard”, DisMax y Extended DisMax (eDisMax). El primero ya posee la posibilidad de realizar búsquedas precisas, mientras que DisMax proporciona además una gran tolerancia a errores en la sintaxis y eDisMax permite el uso de la sintaxis completa de Lucerne (el motor de búsqueda que corre bajo Solr).

Una vez realizada la búsqueda, un reponse writer se encarga del formato final de los resultados. Entre los más utilizados están el XML Response Writer y el JSON Response Writer.

En el siguiente esquema se resume el proceso de búsqueda:

flujo

Los parámetros más utilizados y que son válidos para los tres query parsers son:

  • defType: define el query parser a utilizar, por ejemplo defType=dismax. Si no indicamos este parámetro Solr utilizará el parser standard (defType=lucene)
  • sort: ordena el resultado de la búsqueda en orden ascendente o descendente atendiendo a la puntuación o a cualquier otra característica que se indique. Por ejemplo: ordenar los resultados por el campo precio en orden descendente: sort=price+des
  • start: indica el número de registro a partir del cual se muestran los resultados (0 por defecto). Podemos utilizar este parámetro junto con el parámetro rows para paginación.
  • rows: número de resultados a mostrar. El valor por defecto es 10
  • fq: a través de este parámetro filtramos el resultado de la búsqueda. Esto nos puede resultar útil para acelerar búsquedas complejas puesto que éstas son guardadas en la caché independientemente de los filtros que se aplican. Podemos especificar varios parámetros fq en una misma consulta: mostrar productos con precios entre 10 y 20 y que estén en stock, por ejemplo

fq=precio:[10 to 20]&fq=stock:1

También podemos realizar consultas complejas utilizando los operadores booleanos + y -. De este modo la consulta anterior quedaría:

fq=+precio:[10 to 20] +stock:1

ó suponiendo que el campo stock sólo pueda tener los valores 0 y 1:

fq=+precio:[10 to 20] -stock:0

Tener en cuenta que el primer ejemplo se guardará en la caché como dos filtros diferentes mientras que los siguientes se guardaran como uno solo. Si los parámetros precio y stock se suelen utilizar juntos en una búsqueda será preferible entonces realizar la consulta a nuestro índice con un solo parámetro fq utilizando el formato del segundo ejemplo.

  • debug: este es un parámetro que nos puede resultar útil durante nuestro desarrollo. Los posibles valores son:
  • query: para obtener información sólo sobre la consulta
  • timing: información sobre el tiempo que tarda la consulta en ser procesada
  • results: información sobre la puntuación de los resultados
  • all: toda la información disponible sobre la consulta
  • wt: define el response writer a utilizar para mostrar los resultados. Algunos de los valores posibles son xml, csv, json y php. Este último obtiene los resutlados en forma de un array de PHP. Podríamos utilizar por ejemplo el siguiente código:

$code = file_get_contents(‘http://localhost:8983/solr/productos/select?q=nombre:iPod&wt=php’);

eval(“$result = ” . $code . “;”);

print_r($result);

 

6. Estado y parada del servidor

Podemos obtener información básica (en formato JSON) sobre nuestro servidor Solr con el comando status:

$ bin/solr status

Para detener el servidor Solr ejecutamos el comando stop. Debemos indicar el puerto con la opción –p.

$ bin/solr stop –p <puerto>

También podemos detener todas las instancias en ejecución con la opción –all.

$ bin/solr stop -all