Recoll es una aplicación de escritorio (GUI) que permite indexar y buscar archivos en un sistema local basándose en su contenido (lo que se denomina búsqueda full-text). Sin embargo, gracias a una extensión en Python es posible montar un servicio Web de búsqueda de archivos locales en un servidor headless. Por archivos locales se refiere a archivos localizados en un directorio local del propio servidor.

Esta herramienta puede ser útil para montar un servicio de búsqueda de documentos a través de la Web. Por ejemplo, agregar un servicio de búsqueda de resoluciones de una institución pública en formato PDF a través de un sitio Web.

Recoll es una herramienta full-text search, lo cual significa que puede encontrar datos por el contenido en lugar de por sus atributos externos (como nombre, fecha de modificación, permisos, etc.). El usuario especifica una o varias palabras que deben aparecer en el texto que se está buscando, y recibe una lista de documentos que coinciden ordenados por relevancia. Similar a lo que ocurre con los motores de búsqueda en Internet como Google o Bing.

Los algoritmos para determinar la relevancia de los documentos encontrados pueden ser muy complejos, y en general inferiores al poder de la mente humana para de determinar rápidamente qué documento es más relevante entre los resultados de la búsqueda. La calidad de esta relevancia es tal vez el aspecto más importante cuando se evalúa una herramienta de este tipo. Recoll se basa en la librería de recuperación de información probabilística Xapian para determinar la relevancia.

Toda herramienta de búsqueda full-text está dividida en dos procesos: el proceso de búsqueda y el proceso de indexación. Para que los resultados al buscar documentos sean rápidos, no es posible examinar los documentos cada vez que se ejecuta una búsqueda (en directo, digamos). Sino que se examinan todos los documentos al principio (y luego periódicamente a medida que se modifican o se agregan nuevos), lo que se conoce como proceso de "indexación", y luego se consulta directamente al índice (base de datos de palabras clave asociadas a cada documento). El índice puede ser un diccionario implementado mediante un B-tree que enlaza a todos los documentos que contienen cada palabra.

Como mencionaba anteriormente, Recoll se basa en la librería Xapian para mantener su índice y determinar la relevancia.

Instalación de Recoll

Instalar Recoll y el módulo de extensión de Python:

root@recoll:~# apt-get update && apt-get upgrade
root@recoll:~# apt-get install recoll python-recoll

Crear un usuario para Recoll:

root@recoll:~# useradd -d /home/recoll -c "Recoll" -s /bin/bash -m recoll

Agregar soporte para indexar archivos de tipo MS Word, PDF y otros:

root@recoll:~# apt-get install antiword poppler-utils python3-libxml2 python-libxslt1

Crear el directorio configuración de Recoll en la cuenta de usuario creada anteriormente:

root@recoll:~# su - recoll
recoll@recoll:~$ mkdir .recoll
recoll@recoll:~$ chmod 750 .recoll

Crear el archivo de configuración principal de Recoll (recoll.conf):

recoll@recoll:~$ nano .recoll/recoll.conf

La variable topdirs define una lista de directorios que serán indexados, mientras que skippedPaths define rutas excluidas del proceso de indexación:

topdirs = /pdfs
skippedPaths =

Cerrar la sesión como "recoll":

recoll@recoll:~$ exit

Permitir login SSH para root:

root@recoll:~# nano /etc/ssh/sshd_config
PermitRootLogin yes
root@recoll:~# service sshd reload

Indexación de archivos

Copiar al servidor los archivos que se desean indexar, desde el sistema origen (por ejemplo nuestra estación de trabajo):

emi@hal9000:~$ scp -rP 22 pdfs/ root@recoll.linuxito.com:/usr/local/datos

Volver a deshabilitar el login por SSH para root:

root@recoll:~# sed 's/PermitRootLogin yes/PermitRootLogin no/' -i /etc/ssh/sshd_config
root@recoll:~# service ssh reload

Setear permisos:

root@recoll:~# chown -R recoll:www-data /usr/local/datos/pdfs/
root@recoll:~# chmod -R o-wrx /usr/local/datos/pdfs/

Crear el enlace simbólico al directorio /usr/local/datos:

root@recoll:~# ln -s /usr/local/datos/pdfs/ /pdfs

Abrir una nueva sesión como "recoll" y comenzar el proceso de indexación de archivos:

root@recoll:~# su - recoll
recoll@recoll:~$ recollindex -z

La tarea de indexación inicial lleva un tiempo considerable (dependiendo de la cantidad de archivos en el directorio) ya que se ejecuta un procesos de tipo OCR sobre todos los documentos cuyo formato es soportado (por ejemplo archivos en formato PDF, MS Word, y otros). En la salida muestra la ruta a cada archivo que está siendo agregado al índice.

Al finalizar, cerrar la sesión de "recoll":

recoll@recoll:~$ exit

Instalación de Recoll WebUI

Recoll WebUI es una interfaz Web para Recoll basada en Python. Permite realizar búsquedas en el índice desde cualquier navegador.

Este proyecto está mencionado en la documentación de Recoll como única implementación Web para acceder a una instalación de Recoll de forma remota (HTTP).

Antes de comenzar es necesario instalar Apache y el módulo WSGI (para ejecutar scripts Python desde Apache):

root@recoll:~# apt-get install apache2 libapache2-mod-wsgi

Habilitar el módulo SSL:

root@recoll:/etc/apache2# a2enmod ssl

Clonar la interfaz Web de Recoll:

root@recoll:~# cd /usr/local/www
root@recoll:/usr/local/www# git clone https://github.com/koniu/recoll-webui
root@recoll:/usr/local/www# chown -R recoll:recoll .

Configurar el módulo WSGI:

root@recoll:/usr/local/www# cd /etc/apache2/
root@recoll:/etc/apache2# nano mods-enabled/wsgi.conf
<IfModule mod_wsgi.c>

    WSGIDaemonProcess recoll user=recoll group=recoll threads=1 processes=5 display-name=%{GROUP} python-path=/usr/local/www/recoll-webui
    WSGIScriptAlias /recoll /usr/local/www/recoll-webui/webui-wsgi.py
    <Directory /usr/local/www/recoll-webui>
       WSGIProcessGroup recoll
       Require all granted
    </Directory>

</IfModule>

Crear un alias "/pdfs" para poder descargar los documentos en el directorio /usr/local/datos/pdfs desde un navegador creando un nuevo VirtualHost (copiar la configuración de VirtualHost por defecto):

root@recoll:/etc/apache2# cd sites-available/
root@recoll:/etc/apache2/sites-available# cp default-ssl.conf recoll-ssl.conf
root@recoll:/etc/apache2/sites-available# nano recoll-ssl.conf

Editar la configuración del sitio para que quede de la siguiente forma:

                DocumentRoot /usr/local/datos/pdfs

                Alias /pdfs "/usr/local/datos/pdfs"
                <Directory "/usr/local/datos/pdfs">
                        DirectoryIndex index.html
                        Options -Indexes -FollowSymlinks +MultiViews
                        AllowOverride None
                        Require all granted
                </Directory>

Además es necesario establecer las rutas correctas a los certificados (es posible crear un certificado gratis si no se dispone de uno) y configurar SSL en Apache.

Habilitar el sitio:

root@recoll:/etc/apache2/sites-available# a2ensite recoll-ssl

Finalmente, reiniciar el servidor Apache:

root@recoll:/etc/apache2# service apache2 restart
[ ok ] Restarting Apache httpd web server: apache2.

Configuración de Recoll WebUI

Verificar el funcionamiento accediendo al alias "recoll" definido en la configuración del módulo WSGI (wsgi.conf):

La interfaz es un tanto rudimentaria, pero el funcionamiento del sitio es bastante ágil y eficiente.

Desde el botón de configuración, especificar la URL para descarga de documentos según el alias definido en la configuración de apache (recoll-ssl.conf) editando el campo "Locations":

Guardar los cambios y verificar el funcionamiento de la búsqueda y descarga de archivos:

Mantener el índice actualizado

Tal como se observa en este documento, la instalación, configuración e indexación con Recoll sucede totalmente desde línea de comandos. En ningún momento es necesario lanzar la GUI para realizar tareas.

Es posible mantener el índice actualizado automáticamente corriendo la herramienta recollindex en un cronjob del usuario recoll:

root@recoll:~# mkdir -p /var/log/recoll
root@recoll:~# chown recoll:recoll /var/log/recoll
root@recoll:~# su - recoll
recoll@recoll:~$ crontab -e
0 0 * * * recollindex > /var/log/recoll/recollindex.log 2>&1

De esta forma se corre la reindexación automáticamente todos los días a las 0:00 hs.

Conclusiones

Esta instalación deja el acceso a la instancia de Recoll totalmente abierta hacia el exterior. Antes de llevar esta instalación a producción (dependiendo el caso de uso) es necesario habilitar al menos algún mecanismo de autenticación desde Apache.

Otro inconveniente es que la configuración de Recoll WebUI se guarda en una cookie. Sería interesante que pueda guardarse en el lado servidor y sea general para todos los usuarios. O que por lo menos exista la posibilidad de definir una configuración por defecto y que se oculte a todos los usuarios sin necesidad de modificar el código fuente. Todo esto pensando en una instalación que permita al público en general la búsqueda de documentos públicos del estilo "gobierno abierto".

Por otro lado, el repositorio de Recoll WebUI se encuentra bastante desactualizado, el proyecto parece estancado y no se han agregado nuevas características en mucho tiempo (el último commit fue hace más de 3 años). Sería bueno que además incorpore la posibilidad de crear usuarios y emplear login.

Más allá de estas desventajas puede ser una buena alternativa a otras opciones más complejas como Apache Solr, Elasticsearch, Lucene y otras. Sobre todo si el departamento de IT cuenta con desarrolladores que pueda "meter mano" en el código Python de Recoll WebUI y hacer una adaptación mínima a las necesidades de la organización.

Recoll en cambio es un proyecto activo y a la vez con buena madurez.

Referencias

Compartí este artículo