Solr: el servidor de búsqueda de Apache

Solr (pronunciado “solar”) es un proyecto open source basado en Lucene (software libre de Apache) y escrito en Java. Como servidor de búsqueda, Apache Solr es una de las herramientas más populares para integrar motores de búsqueda verticales. Las ventajas de Solr comprenden una amplia gama de funciones (incluyendo, por ejemplo, el facetado de los resultados de búsqueda) y la indexación acelerada. Se ejecuta en contenedores-servidor como Tomcat (Apache). ¿Cómo funciona Apache Solr? ¿Qué hay que tener en cuenta al utilizar el software por primera vez?

Los orígenes de Apache Solr

La base de Solr la constituye Apache Lucene, software desarrollado por el diseñador Doug Cutting en 1997, que primero lo ofreció a través del servicio de alojamiento de archivos SourceForge. En 2001 entra a formar parte del proyecto Jakarta, lanzado en 1999 por parte de la Apache Software Foundation para apoyar y promover el desarrollo de software libre de Java, por estar también escrito en Java. Desde 2005, Lucene se incluye entre los principales proyectos de Apache y se distribuye bajo una licencia libre de Apache. De Lucene derivaron varios proyectos secundarios como Lucy (Lucene escrito en C) y Lucene.NET (escrito en C#). En Lucene también se basa el popular servidor de búsqueda Elasticsearch, del cual hablaremos más adelante.

Creado en 2004, en aquel entonces Solr todavía se llamaba Solar y era distribuido por CNET Networks. “Solar” representaba las siglas de “Search on Lucene and Resin” (“buscar a Lucene y a Resin”).

En 2006, CNET entregó el proyecto a la Fundación Apache, donde inicialmente pasó por otro periodo de desarrollo. Cuando Solr se puso a disposición del público como un proyecto autónomo en 2007, atrajo pronto la atención de la comunidad Apache, que en 2010 integró el servlet en el proyecto Lucene. Este desarrollo conjunto es el que garantiza la compatibilidad entre ambos. El paquete lo completan SolrCloud y el Tika Parser.

Definición

Apache Solr es un servidor de búsqueda multiplataforma para proyectos web basados en Java. El proyecto de código abierto, basado en la librería Java Lucene, integra documentos en tiempo real y forma clústeres dinámicos. Solr es compatible con PHP, Python, XML y JSON. Este servlet dispone de una interfaz web de usuario donde los comandos se envían en HTTP. Solr ofrece a los usuarios una búsqueda de texto completo diferenciada para documentos de texto enriquecido. Es especialmente adecuado para motores de búsqueda verticales en páginas web estáticas. La extensión vía SolrCloud admite más núcleos y una clasificación de fragmentos ampliada.

Introducción a Solr: términos básicos

Apache Solr se integra como un servlet en Lucene, complementando así a la biblioteca de software. Por esto, y dado que algunos de los sitios web de más renombre, como Netflix o eBay, utilizan Solr como base para sus motores de búsqueda verticales, aclararemos en los siguientes párrafos en qué consiste Apache Lucene.

¿Qué es Apache Lucene?

El software libre Lucene es una biblioteca Java de código abierto y gratuita que se puede utilizar en cualquier plataforma. Conocido como una biblioteca NoSQL escalable y de gran rendimiento, Lucene está especialmente indicado para implementar motores de búsqueda, tanto en Internet como en dominios y consultas locales.

Hecho

Lucene Core es una biblioteca de software para el lenguaje de programación Java. Las bibliotecas sirven como colección ordenada de subrutinas que los desarrolladores utilizan para enlazar programas con módulos auxiliares a través de una interfaz. Durante la ejecución de un programa, este puede, así, acceder al componente requerido en la biblioteca.

Dado que la biblioteca subdivide los documentos en campos de texto y los clasifica de forma lógica, la búsqueda de texto completo con Lucene funciona de forma muy precisa, así como también responde bien al encontrar resultados relevantes para textos y documentos similares. Esto hace que esta biblioteca también sea adecuada para páginas como Yelp. Mientras reconozca un texto, el formato (texto plano, PDF, HTML u otros) es lo de menos porque, en lugar de indexar archivos, Lucene trabaja con texto y metadatos, aunque los archivos se han de extraer de la biblioteca de todas formas.

Para ello, el equipo de Lucene desarrolló el proyecto, ahora independiente, Apache Tika. Apache Tika es una herramienta para el análisis, la traducción o la indexación de textos. La herramienta lee texto y metadatos de más de mil tipos de archivos. A continuación, extrae el texto y lo pone a disposición para su tratamiento posterior. Tika consta de un analizador (parser) y un detector. El analizador examina los textos y estructura el contenido en una jerarquía ordenada. El detector tipifica el contenido. Por ejemplo, reconoce el tipo de archivo, pero también el tipo de contenido de los metadatos.

Funciones y características más importantes de Lucene:

  • Indexación rápida, tanto en fases como por lotes (hasta 150 GB por hora según sus desarrolladores)
  • Uso económico de la memoria RAM
  • Escrito por completo en Java y, por lo tanto, multiplataforma (las variantes en lenguajes de programación alternativos son Apache Lucy y Lucene.NET)
  • Interfaz para plugins
  • Búsqueda por campos de texto (categorías como contenido, título, autor, palabra clave), también para varios al mismo tiempo
  • Clasificación por campos de texto
  • Listado de los resultados de la búsqueda según similitud o relevancia

Lucene divide los documentos en áreas como título, autor y texto. Dentro de estos campos, el software realiza la búsqueda utilizando el analizador de consultas (query parser), considerado un instrumento especialmente eficaz para las consultas de búsqueda introducidas manualmente. Su simple sintaxis consiste en un término de búsqueda y un modificador. Los términos de búsqueda pueden ser palabras o grupos de palabras que pueden ajustarse con un modificador o enlazarse con variables booleanas a una consulta compleja. Los comandos exactos pueden consultarse en el manual Apache sobre la sintaxis del query parser.

Lucene también soporta la búsqueda inexacta sobre la base de la distancia de Levenshtein, que recoge el número de cambios ortográficos (reemplazar, insertar o eliminar) necesario para pasar de una cadena significativa de caracteres a otra. Es decir: de “lupa” (sustituye p por n) a “luna” hay una distancia de 1 porque solo fue necesaria una conversión.

El usuario puede definir un valor que determine el alcance de las desviaciones del término de búsqueda original para que un término se tenga aún en cuenta en los resultados de búsqueda. Este valor se encuentra entre 0 y 1 (cuanto más se acerca a 1, más parecido ha de ser el resultado de la búsqueda a la palabra original). Si no introduce ningún valor, se sitúa por defecto en 0,5. El comando correspondiente se parecerá a este:

lupa~

Para definir un valor con más precisión (0,9, p. ej.) se introduce este comando:

lupa~0.9

Un esquema similar sigue la búsqueda por entorno, en la cual puede definirse la distancia a la que pueden situarse las palabras en el texto para seguir siendo relevantes. En la búsqueda “Alice in wonderland” puede determinarse que las palabras “alice” y “wonderland” estén en un radio de tres palabras.

"alice wonderland"~3

¿Qué es un buscador vertical?

Lucene permite realizar búsquedas en Internet y dentro de los dominios. Los motores de búsqueda que cubren un amplio rango de páginas se denominan motores de búsqueda horizontales. Entre estos se incluyen conocidos proveedores como Google, Bing, Yahoo u otros como DuckDuckGo y Startpage. Un motor de búsqueda vertical, en cambio, se limita a un dominio, un tema o un público objetivo. Un motor de búsqueda específico para un dominio ayuda a los visitantes de un sitio web a encontrar textos u ofertas específicas. Ejemplos de buscadores temáticos son los portales de recomendaciones como TripAdvisor o Yelp, pero también los buscadores de empleo. Los motores de búsqueda específicos para un público objetivo se dirigen, por ejemplo, a los niños y jóvenes o a los científicos que buscan fuentes.

A través de crawlers web enfocados (focused crawlers), los motores de búsqueda verticales encuentran resultados más precisos. Una biblioteca como Lucene, que divide su índice en clases según los principios de la taxonomía y los conecta lógicamente por ontología, es la primera en permitir esta búsqueda de texto completo. Los buscadores verticales utilizan, además, filtros temáticos que limitan el número de resultados.

Hecho

La ontología y la taxonomía son dos principios de la informática relevantes en el archivado. La taxonomía se ocupa de la distribución de los términos en clases, que se estructuran en una jerarquía de forma similar a un diagrama de árbol. La ontología va un paso más allá y relaciona a los términos lógicamente entre sí. Los grupos de términos se agrupan en clústeres que indican una relación estrecha. Asimismo, también se interrelacionan los grupos de términos emparentados, formando así una red de relaciones.

El índice de Lucene representa un archivo escalable para búsquedas, si bien hay algunos pasos fundamentales y rutinarios que no se realizan de forma automática. La búsqueda vertical requiere un índice muy ramificado. Es aquí donde entra en juego Apache Solr, que complementa a las funciones de la biblioteca y se configura con comandos de una forma muy sencilla, incluso para principiantes, en Java. El servlet ofrece muchas herramientas para configurar un motor de búsqueda vertical para una página web y adaptarlo a las necesidades de las visitas.

¿Qué es Solr? La mecánica del servidor de búsqueda

Ahora que ya cuentas con alguna información básica sobre Lucene y el ámbito de aplicación de Solr, pasaremos a ver cómo funciona el servidor, cómo complementa a Lucene y cómo puedes trabajar con él.

Solr: elementos fundamentales

El hecho de estar escrito en Java permite, como dijimos arriba, utilizar a Solr en cualquier plataforma. Los comandos se escriben normalmente en HTTP (Hypertext Transfer Protocol) y para los archivos que se van a guardar se utiliza XML (Extensible Markup Language). Apache Solr también ofrece a los desarrolladores de Python y Ruby su conocido lenguaje de programación a través de una API. En cambio, para aquellos que normalmente trabajan con la Notación de Objetos JavaScript (JSON), ElasticSearch proporciona el entorno óptimo. Con una API, Solr también puede trabajar con este formato.

Aunque está basado en Lucene y encaja perfectamente en su arquitectura, Solr también trabaja solo. Es compatible con contenedores-servidor como Apache Tomcat.

Indexación para resultados precisos en fracciones de segundo

Estructuralmente, el servlet se basa en un archivo invertido (inverted index). Solr utiliza la biblioteca de Lucene para ello. Los archivos invertidos son un subtipo del índice de la base de datos y tienen la función de acelerar la recuperación de información. Dentro de la biblioteca, el índice almacena contenidos, que pueden ser palabras o números. Cuando un usuario busca cierto contenido en un sitio web, suele introducir uno o dos términos de búsqueda relevantes para el tema. En lugar de rastrear estas palabras en todo el sitio web, Solr recurre a la biblioteca.

La biblioteca indexa todas las palabras clave importantes casi en tiempo real y las vincula a los documentos del sitio web en los que se encuentran estas palabras. Pero la búsqueda se limita exclusivamente al índice. La lista de resultados muestra entonces todos los documentos que según el índice contienen esta palabra al menos una vez. Este tipo de búsqueda se corresponde con la búsqueda análoga en un libro: cuando se busca un determinado término en el glosario, se encuentra la página o las páginas donde se encuentra y es ahí a donde se dirige el lector. Siguiendo el mismo principio, la búsqueda vertical muestra una lista de resultados con enlaces a los documentos.

Para que este proceso funcione sin problemas, cada vez que se añade un nuevo documento al catálogo del sitio web es necesario introducir todas las palabras clave y los metadatos (como autor o año de publicación) en la biblioteca. Esto hace que el trabajo interno con Lucene resulte algo tedioso. Con Solr estos pasos pueden automatizarse.

Relevancia y filtro

Apache Solr utiliza la ontología y taxonomía de Lucene para ofrecer resultados de búsqueda altamente precisos con la ayuda de las variables booleanas y el truncamiento matemático, que ya son conocidos por Lucene. A la caché de Lucene, Solr añade una caché de nivel superior. Con esto, el servlet recuerda consultas de búsqueda frecuentes, incluso si consisten en variables complejas, optimizándose así la velocidad de búsqueda.

De cara a mantener a los usuarios en un sitio web, hay que ofrecerles una buena experiencia de usuario. Esto incluye, en particular, hacer las ofertas adecuadas. Por ejemplo, si tus lectores están buscando información sobre apicultura, los textos que deberían aparecer entre los primeros resultados deberían tratar de los ciclos de vida de las abejas y de los métodos de crianza. Otras cuestiones, p. ej., dónde comprar miel ecológica, no deberían formar parte de los resultados de la búsqueda o, al menos, no en lugares prominentes.

En cualquier caso, estén los usuarios buscando un término específico o deban obtener sugerencias con enlaces internos al final de un artículo interesante, es crucial que los resultados sean relevantes. Y para garantizar que el usuario obtiene los resultados más relevantes a su búsqueda, Solr utiliza la medida “tf-idf”.

Hecho

El término term frequency-Inverse document frequency o tf-idf (frecuencia de término – frecuencia inversa de documento) representa una estadística numérica con la cual se compara la densidad de términos de búsqueda en un documento (el número de veces que aparece un único término en el texto) con el número de documentos en el archivo que contienen el término. De esta manera se puede ver si un término de búsqueda aparece realmente con más frecuencia en un documento que en la totalidad de los textos.

Solr: funciones más importantes

Apache Solr recopila e indexa datos (documentos) casi en tiempo real con el apoyo de Lucene Core. El documento es la unidad de medida decisiva tanto para la búsqueda como en el índice. El índice consta de varios documentos y estos, a su vez, de varios campos de texto. En una base de datos, una fila contiene un documento y una columna, los campos.

Si se acopla a Apache Zookeper a través de una API, Solr cuenta con un administrador central que proporciona sincronización, registros de nombres y distribución de configuraciones. Aquí se incluye, por ejemplo, un algoritmo en anillo que asigna un coordinador (leader) a los procesos dentro de un sistema distribuido. Este reconocido mediador también reactiva los procesos si se pierden los tokens y encuentra los nodos (ordenadores en el sistema) utilizando la detección de nodos (node discovery). Todas estas funciones garantizan que tu proyecto permanezca escalable.

Esto también significa que el motor de búsqueda funcione incluso bajo las condiciones más duras. Como se ha mencionado anteriormente, grandes páginas web, que almacenan y gestionan grandes cantidades de datos, también utilizan Apache Solr a diario.

Si un solo servidor Solr no fuera suficiente, con SolrCloud pueden conectarse varios servidores. Esto permite fragmentar los registros de datos horizontalmente, lo que también se denomina fragmentación (sharding). Para ello, debe dividirse la biblioteca en fragmentos enlazados lógicamente. Esto permite ampliar la biblioteca más allá del espacio de almacenamiento disponible. Apache también recomienda cargar múltiples copias de su biblioteca en diferentes servidores. Esto aumenta el factor de replicación. Si llegan muchas peticiones al mismo tiempo, éstas se distribuyen entre los diferentes servidores.

La búsqueda de texto completo, que ya soportaba Lucene, Solr la amplía con más funciones, entre otras:

  • Reajuste de términos también para grupos de palabras: el sistema detecta errores ortográficos en la entrada y proporciona resultados para una alternativa corregida.
  • Joins (uniones): una mezcla entre el producto cartesiano (en la búsqueda se consideran varios términos en cualquier orden) y la selección (solo se muestran los términos que cumplen una determinada condición), es decir, una sintaxis compleja de variables booleanas.
  • Agrupación de términos relacionados temáticamente.
  • Clasificación en facetas: el sistema clasifica cada elemento de información individual según varias dimensiones. Por ejemplo, a un texto lo asocia con palabras clave como el nombre del autor, el idioma y la longitud del texto, junto a los temas de los que trata el texto, así como a una clasificación cronológica. La búsqueda en facetas permite al usuario utilizar varios filtros y obtener así una lista de resultados personalizada.
  • Búsqueda con “comodín”: ¿un carácter representa a un elemento indefinido o a varios de estos elementos en una cadena? Para un carácter se utiliza “?” y para varios “*”. Por ejemplo, si se introduce el fragmento de una palabra más el comodín para varios caracteres, como prof*, la lista de resultados incluirá todos los términos con esta raíz (profesor, profesorado, profesión), de modo que el usuario obtiene resultados para estos temas. La relevancia resulta de la delimitación del tema de su biblioteca o de otras delimitaciones de búsqueda. Por ejemplo, si los usuarios buscan "l?na", obtendrán resultados como luna, lana o lena, pero no, en cambio, palabras como liana o leona, ya que “?” solo sustituye a una letra.
  • Reconocimiento de texto en muchos formatos, desde Microsoft Word hasta PDF y contenido enriquecido indexado, pasando por editores de texto.
  • Detección de diferentes idiomas.

El servlet también puede integrar varios núcleos (core). Estos núcleos están compuestos por índices de Lucene, de modo que el núcleo recopila toda la información en una biblioteca, incluidos los archivos de configuración y los esquemas. Con esto se define el comportamiento de Apache Solr. Si deseas utilizar extensiones, inserta en el archivo de configuración tus scripts o los plugins aportados por la comunidad.

Ventajas Desventajas
Amplía Lucene con características prácticas Indexación automática en tiempo real Búsqueda de texto completo Facetado y agrupación de palabras clave Control total sobre los fragmentos Facilita el escalamiento horizontal de los servidores de búsqueda Fácil de integrar en un sitio web Menos adecuado para datos y objetos dinámicos Los núcleos y fragmentos partidos solo pueden añadirse manualmente La caché global puede costar tiempo y espacio en comparación con la caché segmentada  

Tutorial de Apache Solr: descarga y configura tu servidor de búsquedas

Los requisitos del sistema para Solr no son muy altos. Solo necesitas un entorno de ejecución Java SE a partir de la versión 1.8.0 y un sistema operativo Linux/Unix, macOS o Windows en diferentes versiones, donde los desarrolladores ya probaron el servlet.

Comienza este tutorial descargando el paquete de instalación correspondiente y extrayendo el archivo.zip (paquete Windows) o el archivo.tgz (paquete Unix, Linux y OSX) a un directorio de tu elección.

Nota

Las imágenes de este tutorial se corresponden con la versión 7.3.0.

Primer paso: descargar e iniciar

1. Visita la página de Solr dentro del proyecto principal Lucene. En la barra de menús en la parte superior de la ventana, la categoría “Features” informa sobre las funciones de Solr. En “Resources”, Apache ofrece diversos manuales y documentación. En “Community” puedes recurrir al apoyo de los seguidores de Solr, así como aportar tus propios builds.

2. Para proceder a la instalación, pulsa en el botón de descarga, que te conduce a una lista de descargas espejo (réplicas de la descarga original). La versión actual de Solr (8.0.0 a fecha de marzo de 2019) de un proveedor garantizado suele encabezar la lista, pero también puedes optar por enlaces HTTP y descargas FTP. Pinchando en un enlace, accederás al sitio web espejo del proveedor.

3. En esta imagen se observan varios paquetes de descarga disponibles, en este caso, para la versión actual 8.0.0:

  • solr-8.0.0-src.tgz es el paquete para desarrolladores, porque contiene el código fuente en el cual también se puede trabajar fuera de la comunidad GitHub.
  • solr-8.0.0.tgz es la versión para usuarios de Mac y Linux/Unix.
  • solr-8.0.0.zip contiene el paquete compatible con Windows.
  • En la carpeta changes/ se guarda la documentación para esta versión.

Al escoger una de ellas, aparece una ventana de descarga. Deberás guardar el archivo. Cuando la descarga haya finalizado, clica en el botón de descarga de tu navegador y abre la carpeta de la descarga.

4. Descomprime el archivo .zip o .tgz según sea tu caso. Si por ahora solo quieres conocer el programa, escoge un directorio cualquiera y guarda en él los archivos descomprimidos. Si, en cambio, ya tienes una idea precisa de cómo vas a emplear Solr, escoge el servidor que has previsto para ello o configura un entorno cloud clusterizado si ya sabes que lo vas a escalar hacia arriba (en el siguiente capítulo nos detendremos en esto).

Nota

En teoría, una sola biblioteca Lucene es capaz de indexar más de dos mil millones de documentos, pero en la práctica esta cifra no suele alcanzarse sin que el rendimiento se vea afectado. Por eso, si se prevé la entrada de tal cantidad de documentos, es mejor incluir en la planificación desde el principio una nube Solr.

5. En nuestro ejemplo para Linux, Solr se encuentra en Home. En este tutorial el código se probó en Ubuntu, de modo que nuestros ejemplos también se pueden probar en macOS. Los comandos, si bien funcionan también con Windows, lo hacen con barra inversa en lugar de barra normal.

Introduce “cd //[ruta de almacenamiento]” en la línea de comandos para abrir el directorio Solr e iniciar el programa. En nuestro ejemplo:

cd /home/test/Solr/solr-7.3.0
bin/solr start

El servidor Solr corre ahora en el puerto 8983. El cortafuegos podría requerir tu confirmación (confírmalo).

Si quisieras detener a Solr, introduce este comando:

bin/solr stop -all

Si Solr funciona bien, comienza a utilizarlo para conocerlo. La versión de prueba te permite iniciar el programa en uno de sus cuatro modos:

  • SolrCloud (comando: cloud)
  • Controlador para la importación de datos (dataimport handler) (comando: dih)
  • Sin esquema (comando: schemaless)
  • Ejemplo demostrativo basado en un fregadero de cocina (comando: techproducts)

Cada uno de estos cuatro modos cuenta con un esquema propio que se edita en la interfaz de esquemas. Para hacerlo, introduce este comando (el marcador [ejemplo] representa a uno de los cuatro comandos de arriba):

bin/solr -e [ejemplo]

6. Con esto, Solr empieza a ejecutarse en el modo elegido. Para asegurarte, abre el informe de estado así:

bin/solr status
Found 1 Solr nodes:
Solr process xxxxx running on port 8983

7. Estos cuatro modos de muestra contienen ajustes básicos predefinidos. Si pones en marcha Solr sin ellos, tienes que definir tú mismo tanto el esquema como el núcleo. El núcleo guarda tus datos y sin él no puedes ni indexar datos ni buscarlos. Con este comando crearás un núcleo:

bin/solr create –c <nombre_del_núcleo>

8. La interfaz de usuario de Apache Solr está basada en el navegador. Si has puesto el programa en marcha con éxito, la aplicación web de administración de Solr se encuentra en la dirección 'http://localhost:8983/solr/'.

9. Finalmente, utiliza este comando para detener a Solr:

bin/solr stop -all

Segundo paso: conocer los comandos

Solr proporciona una sencilla herramienta de comandos llamada Post-Tool que permite cargar contenido, compuesto tanto por documentos para el índice como por configuraciones de esquemas, en el servidor. Para poder hacerlo, la herramienta recurre a tu colección. Este es el motivo por el que, antes de empezar a trabajar, hay que proporcionar siempre el núcleo (la colección).

En nuestro siguiente código de muestra, seguiremos la forma habitual. En <colección> deberás escribir el nombre de tu núcleo/colección. “–c” es el comando de “create”. Con él podrás crear un núcleo o una colección. Después podrás definir otras opciones o ejecutar comandos. Por ejemplo, con “–p” podrás escoger un puerto y con “*.xml” o “*.csv” cargar en tu colección todos los archivos con este formato (filas 2 y 3). Con el comando “–d” borrarás documentos de tu colección (fila 4):

bin/post –c <colección> [opciones] <archivos|colecciones|URL>
bin/post –c <colección> -p 8983 *.xml
bin/post –c <colección> *.csv
bin/post –c <colección> -d '<delete><id>42</id><delete>'

Ahora, ya conoces algunos de los comandos básicos para Solr. Para saber cómo debes proceder en concreto para configurar Apache Solr, utilizaremos el ejemplo predefinido del fregadero de cocina.

1.Inicia Solr con la versión de prueba. Para seleccionar “kitchen sink demo” introduce el comando “techproducts”:

bin/solr –e techproducts

Solr se inicia por defecto en el puerto 8983. La terminal te informará de la creación de un nuevo núcleo para tu colección y el indexado de algunos archivos para tu catálogo. En la demo del “kitchen sink” deberías encontrar esta información:

Creating Solr home directory /tmp/solrt/solr-7.3.1/example/techproducts/solr
Starting up Solr on port 8983 using command:
bin/solr start -p 8983 -s "example/techproducts/solr"
Waiting up to 30 seconds to see Solr running on port 8983 [/]
Started Solr server on port 8983 (pid=12281). Happy searching!
Setup new core instance directory:
/tmp/solrt/solr-7.3.1/example/techproducts/solr/techproducts
Creating new core 'techproducts' using command:
http://localhost:8983/solr/admin/cores?action=CREATE&name=techproducts&instanceDir=techproducts
{"responseHeader":
{"status":0,
"QTime":2060},
"core":"techproducts"}
Indexing tech product example docs from /tmp/solrt/solr-7.4.0/example/exampledocs
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/techproducts/update…
using content-type application/xml...
POSTing file money.xml to [base]
POSTing file manufacturers.xml to [base]
POSTing file hd.xml to [base]
POSTing file sd500.xml to [base]
POSTing file solr.xml to [base]
POSTing file utf8-example.xml to [base]
POSTing file mp500.xml to [base]
POSTing file monitor2.xml to [base]
POSTing file vidcard.xml to [base]
POSTing file ipod_video.xml to [base]
POSTing file monitor.xml to [base]
POSTing file mem.xml to [base]
POSTing file ipod_other.xml to [base]
POSTing file gb18030-example.xml to [base]
14 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/techproducts/update...
Time spent: 0:00:00.486
Solr techproducts example launched successfully. Direct your Web browser to
http://localhost:8983/solr to visit the Solr Admin UI

2. Solr ya se está ejecutando y ha cargado algunos archivos XML en el índice con los que más tarde podrás trabajar. En los pasos que vienen a continuación, deberías intentar guardar algunos archivos en el índice. Esto puede hacerse en la interfaz de usuario del panel de administración de Solr que vimos antes. Abre el servidor Solr en tu navegador. En nuestra versión de prueba Solr ha definido ya el servidor y el puerto. Escribe esta dirección en tu navegador: "http://localhost:8983/solr/".

Si ya definiste un nombre de servidor y un puerto, utiliza la siguiente sintaxis: "http://[nombredelservidor]:[numerodepuerto]/solr/".

Aquí, navega a la carpeta example/exampledocs que incluye ya algunos archivos de muestra así como el archivo post.jar. Escoge el archivo que quieras incluir en el catálogo y utiliza a post.jar para incluirlo. Para nuestro ejemplo escogemos more_books.jsonl. Introduce el siguiente código en tu terminal:

cd example/exampledocs
Java -Dc=techproducts –jar post.jar more_books.jsonl

Si Solr ha cargado tus archivos en el índice emitirá este mensaje:

SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/techproducts/update 
POSTing file more_books.jsonl to [base]
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/techproducts/update...
Time spent: 0:00:00.162

3. Cuando se instala el servidor de búsqueda es conveniente instalar también los archivos de configuración y el esquema, que en las versiones de prueba ya están definidos. Si, en cambio, trabajas en un servidor nuevo, tendrás que definir el juego de configuraciones (Config-Set) y el esquema tú mismo.

El esquema (schema.xml) establece el número, el tipo y la estructura de los campos en los documentos. Como se mencionó anteriormente, en Lucene los documentos se componen de campos. Esta forma de estructura favorece la búsqueda de texto completo. Solr trabaja con estos campos. Cada tipo de campo acepta cierto contenido (<date>, p. ej., solo acepta fechas en el formato año-mes-día-hora). Con el esquema puedes definir qué tipo de campo reconocerá el índice y cómo lo clasificará. Si no lo haces, los documentos determinarán los tipos de campo. Si en la fase de prueba esto puede resultar práctico, porque así puedes comenzar a llenar el catálogo, más adelante podría generar problemas.

Estos son algunos de los tipos de campo básicos de Solr:

  • DateRangeField (indexa franjas temporales y momentos exactos hasta el milisegundo)
  • ExternalFileField (extrae valores de una carpeta externa)
  • TextField (campo para la entrada de texto)
  • BinaryField (campo para datos binarios)
  • CurrencyField indexa dos valores por separado, pero los muestra al usuario como uno solo: el campo guarda un valor numérico, p. ej., 4,50, y una moneda, p. ej., €, cada uno en un campo, pero el usuario los verá juntos, es decir, 4,50 €.
  • StrField (UTF-8 y Unicode-String en un campo pequeño. Ni se analizan ni se reemplazan por un token.)

En la wiki de Solr encontrarás una exhaustiva lista de tipos de campo y otros comandos para ajustes de esquema.

Con el fin de definir tipos de campo, abre schema.xml en 'http://localhost:8983/solr/techproducts/schema', donde encontrarás los tipos de campo predefinidos enTechproducts”. Una línea de comandos en el archivo XML describe las propiedades de un campo a partir de atributos con más exactitud. Según la documentación, Apache Solr es compatible con estos atributos:

  • field name (No puede estar vacío. Contiene el nombre del campo.)
  • type (Introduce un tipo válido de campo. No puede quedar vacío.)
  • indexed (Significa que se ha indexado. Si el valor es “true”, puede buscarse por este campo o clasificarlo.)
  • stored (Describe si el campo se ha guardado. Si el valor es “true”, puede localizarse.)
  • multiValued (Si un campo contiene varios valores para un documento, aparece aquí el valor “true”.)
  • default (Aquí se introduce un valor por defecto, que aparecerá cuando no se haya definido ningún valor para un documento nuevo).
  • compressed (Pocas veces está configurado como “false”, porque solo puede aplicarse en campos comprimibles gzip. Para poder comprimir ha de figurar “true”.)
  • omitNorms (Normalmente está configurado como “true”. Se ahorran normas para un campo y también espacio en disco.)
  • termOffsets (Necesita más espacio. Guarda vectores junto con datos offset, es decir, complementos a la dirección de la memoria.)
  • termPositions (Requiere más espacio porque guarda la posición de los términos junto con el vector.)
  • termVectors (Por defecto está como “false”; si contiene “true”, almacena vectores de término.)

Las propiedades de los campos pueden añadirse en el archivo schema.xml o utilizando un comando en la terminal. En el archivo, un tipo simple de campo aparece así:

<fields>
<field name="name" type="text_general" indexed="true" multivalued=”false” stored="true" />
</fields>

Si utilizas la terminal de comandos, introduce un comando “curl”, define los atributos del campo y envíalo a través de la interfaz schema indicando la dirección del archivo:

curl -X POST -H 'Content-type:application/json' --data-binary '{"add-field": {"name":"name", "type":"text_general", "multiValued":false, "stored":true}}' http://localhost:8983/solr/techproducts/schema

4.Una vez configurado el archivo schema, es el turno de la configuración de Solr, con la cual se establecen los ajustes de la búsqueda. Los componentes más importantes son:

  • Parámetros de caché de la consulta
  • Gestor de la petición (request-handler)
  • Localización del directorio de los datos
  • Componentes de búsqueda

Los parámetros de la caché de la consulta permiten tres tipos de caching: LRUCache, LFUCache y FastLRUCache. LRUCache utiliza un mapa hash enlazado y FastLRUCache recoge datos sobre un mapa hash concomitante. Estos mapas hash procesan peticiones simultáneamente, lo que permite al servidor de búsqueda producir respuestas más ágiles en el caso de que las búsquedas tengan lugar de forma paralela. FastLRUCache lee los datos más rápido que el primero pero los añade más despacio.

Hecho

Un mapa hash asigna valores a una clave. Esta clave es unívoca (un valor por clave). Esta clave es un objeto cualquiera y de aquí se deriva el valor hash, que es prácticamente una “dirección”, esto es, la posición exacta en el índice. Con él se encuentra el valor de la clave en una tabla.

El gestor de consultas procesa las solicitudes: lee el protocolo HTTP, busca en el índice y emite las respuestas. La configuración de Techproducts contiene el gestor estándar para Solr. Los componentes de búsqueda se encuentran enumerados en el gestor de peticiones y son los que ejecutan la búsqueda. Por defecto, el gestor contiene lo siguientes componentes:

  • query (petición)
  • facet (facetado)
  • mlt (More Like This)
  • highlight (mejores)
  • stats (estadística)
  • debug (erradicar errores)
  • expand (ampliar la búsqueda)

Para el componente de búsqueda “More Like This” (mlt) escribe el siguiente comando:

<searchComponent name="mlt" class="org.apache.solr.handler.component.MoreLikeThisComponent" />

Este componente encuentra documentos con contenido y estructura similares. Consta como clase en Lucene. La consulta encuentra contenidos para los usuarios de una página comparando la secuencia de caracteres y los campos indexados.

Para configurar la lista, abre el gestor de consultas:

<requestHandler name="standard" class="solr.SearchHandler" default="true">
<lst name="defaults">
<str name="echoParams">explicit</str>
<!--
<int name="rows">10</int>
<str name="fl">*</str>
<str name="version">2.1</str>
-->
</lst>
</requestHandler>

En esta lista puedes añadir componentes definidos por ti mismo o cambiar los que contenga. Cuando un usuario que visite tu dominio introduzca una consulta, la búsqueda asumirá estos componentes. El siguiente comando añade tu componente por delante del estándar:

<arr name="first-components">
<str>NombreDeTuComponente</str>
</arr>

Para añadirlo después:

<arr name="last-components">
<str>NombreDeTuComponente</str>
</arr>

Para renombrar los componentes estándar:

<arr name="components">
<str>facet</str>
<str>NombreDeTuComponente</str>
</arr>

El directorio de datos estándar se encuentra localizado en el directorio de instancias del núcleo “instanceDir” bajo el nombre de “/data”. Si quisieras utilizar otro directorio diferente, cambia la localización en solrconfig.xml. Para hacerlo introduce una ruta determinada o conecta el nombre del directorio al núcleo (SolrCore) o el directorio de instancias (instanceDir). Para la conexión al núcleo escribe:

<dataDir>/solr/data/$(solr.core.name)</dataDir>

Tercer paso: configurar un clúster en la nube

Apache Solr proporciona una nube de prueba que utilizaremos para explicar cómo se configura un clúster en la nube.

1.Inicia la interfaz de usuario de la línea de comandos. Para iniciar Solr en el modo Cloud, escribe lo siguiente:

bin/solr -e cloud

La demo se inicia.

2.Especifica cuántos servidores (aquí: nodos) se han de conectar por medio de la nube. Esta cifra puede situarse entre [1] y [4] (en nuestro ejemplo hemos elegido [2]). La demo trabaja en una máquina, pero utiliza un puerto diferente para cada servidor que se ha de indicar a continuación (la demo prescribe los números de puerto):

Welcome to the SolrCloud example!
This interactive session will help you launch a SolrCloud cluster on your local workstation.
To begin, how many Solr nodes would you like to run in your local cluster? (specify 1-4 nodes) [2]
Please enter the port for node1 [8983]
Please enter the port for node2 [7574]
solr start –cloud -s example/cloud/node1/solr -p 8983
solr start –cloud -s example/cloud/node2/solr -p 7574

Asignados todos los puertos, el script muestra (como se observa arriba) los comandos para iniciar los servidores.

3.Con los servidores en marcha, selecciona un nombre para tu colección de datos (los corchetes señalizan comodines y no aparecen en el código).

Please provide a name for your new collection: [Nombre]

4.Con SPLITSHARD crearás un fragmento a partir de esta colección que después podrás particionar aún más. De esta forma, se agiliza la búsqueda en los casos en que tengan lugar varias consultas al mismo tiempo.

http://localhost:8983/solr/admin/collections?action=CREATESHARD&shard=[NuevoFragmento]&collection[NombreDeLaColección]

Una vez fragmentada tu colección con SPLITSHARD, puedes repartir tus datos con ayuda de un rúter. Por defecto, Solr integra el rúter compositeID (router.key=compositeId).

Hecho

Un rúter establece cómo se distribuyen los datos en los fragmentos y cuántos bits puede utilizar la clave del rúter. Si se utilizan 2 bits, el rúter indexa datos en un cuarto de memoria por fragmento. Con esto se evita que los registros grandes se apropien de toda la memoria en un único fragmento, porque la búsqueda se ralentizaría. Para utilizar el rúter, proporciona un valor (por ejemplo, un nombre de usuario cualquiera), el número de bits y la identificación del documento de esta forma: [nombre de usuario] / [número de bits]! [Id del documento] (por ejemplo: Perico Palotes/2!1234).

En la interfaz subdivides el fragmento en dos partes. Estas dos particiones contienen la misma copia de los datos originales. El índice las subdivide a lo largo de las áreas secundarias recién creadas.

/admin/collections?action=SPLITSHARD&collection=[nombre de la colección]&shard=[número del fragmento]

5.En el último paso se especifica el nombre del directorio de configuración. Puedes escoger entre sample-techproducts-configs y _default. Este último no fija ningún esquema, de modo que si lo eliges, tendrás que ajustarlo tú mismo. Con el siguiente comando desactivas la función sin esquema de _default para la interfaz de SolrCloud:

curl http://localhost:8983/api/collections/[_nombre_de_la_colección]/config -d '{"set-user-property": {"update.autoCreateFields":"false"}}'

Con él impides que los campos, a la vista de los primeros contenidos, creen esquemas incompatibles con el resto de archivos. Dado que, para esta configuración, necesitas utilizar el método HTTP POST, no puedes utilizar la barra de direcciones del navegador. “localhost:8983” equivale al primer servidor. Si has elegido un número de puerto diferente, has de añadirlo aquí. En [_nombre_de_la_colección] escribe tu nombre elegido.

Tu nube Solr ya está configurada. Si quieres ver si la nueva colección se muestra correctamente consulta el estado de nuevo:

bin/solr status

En la interfaz de administración obtendrás una vista más precisa sobre la distribución de tus fragmentos. La dirección se compone del nombre de tu servidor junto con el número de puerto y la conexión a SolrCloud de esta forma: "http://nombredelservidor:númerodepuerto/solr/#/~cloud"

Cómo ampliar Apache Solr con plugins

Apache Solr ya cuenta con algunas extensiones. Se trata de los llamados “handler” (gestores o controladores). Un poco más arriba ya vimos al gestor de peticiones. Lucene (y Solr) también soporta algunos scripts nativos como la clase “analyzer” y la clase “similarity”. Los plugins se integran en Solr con un archivo JAR. Si has creado tus propias extensiones que interactúan con interfaces Lucene, deberías añadir los archivos lucene-*.jars de tu biblioteca (solr/lib/) en el tipo de clases con el que compilas el código fuente de tu plugin.

Este método funciona si solo utilizas un núcleo. Si usas la SolrCloud, crea una biblioteca compartida para los archivos JAR. Crea para ello un directorio con el atributo “sharedLib” en el archivo solr.xml en tu servlet. Este es un método simple para cargar plugins en núcleos:

Si has construido tu propio núcleo, crea un directorio para la biblioteca con el comando “mkdir” (en Windows, “md”) de esta forma:

mkdir solr/[ejemplo]/solr/colecciónA/lib

Si solo estás probando Solr con alguna de las demos, navega en cambio a “example/solr/lib”. En ambos casos te encontrarás en el directorio de la biblioteca de tu directorio de instancias. Aquí podrás guardar los archivos JAR de tus plugins.

Otra opción, a la que se puede recurrir cuando, por ejemplo, no se tiene éxito en el contenedor servlet con la primera variante, consiste en utilizar el método de las versiones antiguas de Solr.

  • Descomprime el archivo solr.war.
  • Añade al directorio WEB-INF/lib el archivo JAR con la clase que has creado. El directorio se encuentra en la web app siguiendo esta ruta: server/solr-webapp/webapp/WEB-INF/lib.
  • Vuelve a comprimir el archivo WAR modificado.
  • Aplica tu archivo solr.war.

Si amplías la biblioteca con una opción “dir”, esta se encarga de añadir todos los archivos dentro de cada directorio a la ruta de la clase. Con “regex=” se excluyen todos los archivos que no cumplen con las normas “regex”.

<lib dir="${solr.install.dir:../../../}/contrib/../lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../..}/dist/" regexe="plugin_name-\d.*\.jar" />

Si vas a desarrollar el script de tu plugin, para el entorno Java se recomienda entre otros el Lisp-Dialekt Clojure. Este lenguaje de programación soporta también el desarrollo interactivo de programas. Otros lenguajes integran sus propiedades nativas y Clojure las pone a disposición en la biblioteca. Esta metodología de trabajo se ajusta al uso del servlet Solr.

El lenguaje de programación y scripts Groovy es compatible con la tipificación dinámica y estática en la máquina virtual Java. El lenguaje está basado en Ruby y Pithon y se compila en código Byte Java. Esto hace que pueda ejecutarse en un script. Groovy contiene algunas características que amplían las facultades de Java. El lenguaje integra, por ejemplo, una plantilla simple para crear código en SQL o HTML. Groovy Syntax ofrece, asimismo, expresiones muy frecuentes o campos de datos para listas preparadas para usarse. Si editas JSON o XML para tu servidor de búsqueda Solr, Groovy ayudar a mantener la sintaxis limpia e inteligible.

Solr frente a Elasticsearch

Cuando se trata de motores de búsqueda de código abierto, Solr y Elasticsearch, ambos basados en la biblioteca Java de Apache Lucene, están siempre a la cabeza en pruebas y encuestas. Lucene, indexando con flexibilidad la información y proporcionando respuesta a consultas complejas, constituye aparentemente una base estable con la que ambos buscadores ofrecen servicios convincentes. Cada uno de los proyectos cuenta también con el apoyo de una comunidad activa.

El equipo de desarrollo de Elasticsearch trabaja con GitHub, mientras que Solr trabaja en la Fundación Apache. En comparación, el proyecto Apache cuenta con una trayectoria más larga, con una comunidad que ha estado documentando todos los cambios, características y errores desde 2007. La documentación de Elasticsearch no es tan completa y por este motivo ha recibido críticas. Sin embargo, Elasticsearch no se queda atrás en términos de usabilidad.

Con Elasticsearch puede construirse una biblioteca en pocos pasos. Para las prestaciones especiales se necesitan plugins Premium con los que puede administrarse la configuración de seguridad, supervisarse el servidor de búsqueda o analizarse las métricas. El servidor de búsqueda también reúne una familia bien coordinada de productos a su alrededor. Bajo la etiqueta Elastic-Stack and X-Pack se obtienen algunas funciones básicas gratis. Sin embargo, los paquetes Premium solo están disponibles con una suscripción mensual con una licencia por nodo. Solr, por otro lado, siempre es libre, incluyendo extensiones como Tika y Zookeeper.

La mayor diferencia entre los dos motores de búsqueda radica en su enfoque principal. Puedes utilizar tanto Solr como Elasticsearch para pequeños conjuntos de datos, así como para grandes datos que se distribuyen en múltiples entornos, pero Solr se ha centrado en la búsqueda de texto, mientras que el concepto de Elasticsearch combina la búsqueda con el análisis. El servlet procesa métricas y registros desde el principio, manejando estos volúmenes de datos fácilmente, pues el servidor integra núcleos y fragmentos dinámicamente desde la primera versión.

Si Elasticsearch superaba con esto en su momento a su principal rival, hace algunos años que la nube de Solr también permite la clasificación de facetas. Con datos dinámicos, Elasticsearch sigue estando ligeramente por delante. A cambio, el competidor puntúa con datos estáticos. Produce resultados específicos para la búsqueda de texto completo y calcula los datos con exactitud.

Estos dos conceptos diferentes también se reflejan en el caching. Ambos proveedores ofrecen caché de consulta, lo que significa que cuando una consulta utiliza variables booleanas complejas, ambas almacenan los elementos de índice solicitados en segmentos. Estos pueden fusionarse en segmentos más grandes. Sin embargo, si solo cambia un segmento, Apache Solr debe invalidar toda la caché y recargarla. Elasticsearch limita este proceso al segmento afectado. Esto ahorra espacio de almacenamiento y tiempo.

Si trabajas regularmente con XML, HTTP y Ruby, no te será difícil acostumbrarte a Solr. JSON se añadió más tarde a través de una interfaz. Es por eso que el lenguaje y el servlet no encajan perfectamente todavía. Elasticsearch, en cambio, se comunica de forma nativa a través de JSON. Otros lenguajes como Python, Java,.NET, Ruby y PHP están incluidos en el servidor de búsqueda por medio de una interfaz similar a REST.

En resumen

Apache Solr y Elasticsearch son dos potentes servidores de búsqueda que casi pueden recomendarse sin restricciones. Quien da más importancia al análisis de datos y opera un sitio web dinámico, hará bien en recurrir a Elasticsearch. Solr es una buena opción si necesitas una búsqueda precisa de texto completo. Con variables complejas y filtros personalizables, puedes adaptar su motor de búsqueda vertical exactamente a tus necesidades.

  Solr Elasticsearch
Tipo Servidor de búsqueda libre de código abierto Servidor de búsqueda basado en código abierto libre con versiones propietarias (gratis y suscripción)
Lenguajes compatibles Nativos: Java, XML, HTTP API: JSON, PHP, Ruby, Groovy, Clojure Nativos: JSON API: Java, .NET, Python, Ruby, PHP
Bases de datos Bibliotecas Java, NoSQL, con ontología y taxonomía, en especial Lucene Bibliotecas Java, NoSQL, en especial Lucene y Hadoop
Nodos y clasificación de fragmentos Más bien estático Los nodos con SolrCloud y los fragmentos con SPLITSHARD pueden añadirse manualmente Desde Solr7: escalado automático por interfaz Control sobre fragmentos por algoritmos de anillo Descubrimiento de nodos con una API Zookeeper Dinámico Los nodos y fragmentos se añaden con una herramienta interna, menor control sobre los leader Descubrimiento de nodos con herramienta zen integrada
Caché Caché global (vale para todos los segmentos secundarios en un segmento) Caché segmentada
Búsqueda de texto completo Muchas funciones contenidas en el código fuente (también ofrece funciones Lucene) Analizador sintáctico de consultas Aplicación de propuestas Búsqueda por similitud Revisión ortográfica en varios idiomas Compatible con muchos formatos de texto enriquecido Resaltados y acentuaciones   La búsqueda se ejecuta principalmente sobre funciones Lucene La interfaz para propuestas ordena la máscara de búsqueda pero ofrece poco margen para ajustes Revisión ortográfica, matching a través de una API Los resaltados son poco personalizables
¿Le ha resultado útil este artículo?
Page top