Instalar Apache Solr 7 con Dovecot 2 para búsquedas FullText

Publicado por sati en

El problema de tener muchos correos es que se hace muy lento buscar por IMAP, con Solr y Dovecot podemos hacer unas búsquedas mucho mas rápidas.

¿Qué es Solr?

Solr es un motor de búsquedas, el cual se encarga de indexar contenido de todo tipo (XML, JSON, CSV, ….) y las consultas se realizan a través de REST que devuelve los resultados como XML, JSON, CSV, ….
La característica que hace que sea bueno para este proyecto es que es posible hacer búsquedas de texto completo “Full Text Search” o también “fts”

Funcionamiento:

Solr es válido para guardar cualquier tipo de contenido, (logs, anuncios, documentos, etc…) pero nosotros lo usaremos para correo.
Indexación: Dovecot se encarga de enviar a Solr los nuevos, los cambios y el borrado de los correos.
Búsqueda: Dovecot se conectará a Solr para realizar búsquedas, Solr le devolverá en formato XML los IDs de los emails y con eso Dovecot devolverá los correos.

Idea:

La idea es que Dovecot no tarde mucho en realizar búsquedas y devolver los resultados.
Es necesario crear en Solr un índice (core) al que llamaremos “dovecot” en donde se guardarán los indices del correo.

Entorno:

Debian 9
Dovecot 2.2.27

Empezamos a instalar:

Lo primero que tenemos que tener instalado, configurado y en funcionamiento es Dovecot 2.2. (importante)
Instalar dovecot-solr:

# apt-get install dovecot-solr

Descargar Solr 7 desde http://apache.rediris.es/lucene/solr/7.3.1/solr-7.3.1.zip

# cd /tmp
# wget http://apache.rediris.es/lucene/solr/7.3.1/solr-7.3.1.zip
# unzip -q solr-7.3.1.zip
# cd solr-7.3.1
# ./bin/install_solr_service.sh /tmp/solr-7.3.1.zip

Después de esto, tendremos el servicio disponible en el puerto 8983 y podemos entrar por el navegador:
http://{TU IP o DOMINIO}:8983/solr/ por ejemplo http://localhost:8983/solr/

Creando un índice (core) para dovecot

La instalación de Solr creará el usuario solr, ahora debemos entrar como dicho usuario para poder crear el índice:

# su solr
$ /opt/solr/bin/solr create -c dovecot
$ exit

o también

# su - solr -c "/opt/solr/bin/solr create -c dovecot"

Se creará el directorio:

/var/solr/data/dovecot/

Dentro de ese directorio debemos copiar solr-schema.xml y borrar managed-schema:

# cd /var/solr/data/dovecot/conf/
# cp /usr/share/dovecot/solr-schema.xml schema.xml
# rm managed-schema

Después editamos:

# vi /var/solr/data/dovecot/conf/solrconfig.xml

Buscamos y comentamos todo el bloque:

<processor class="solr.AddSchemaFieldsUpdateProcessorFactory">
.....
</processor>

por

<!--
<processor class="solr.AddSchemaFieldsUpdateProcessorFactory">
.....
</processor>
-->

Por defecto, los resultados los devuelve en JSON, pero Dovecot espera recibirlos en XML, modificamos el valor de wt a xml:

<requestHandler name="/query" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<str name="wt">xml</str> 
<!-- <str name="wt">json</str> -->
<str name="indent">true</str>
</lst>
</requestHandler>

Y habilitar el XML como respuesta en la zona “queryResponseWriter” yo lo he puesto antes del JSON:

.......
<queryResponseWriter name="xml" default="true" class="solr.XMLResponseWriter" >
<str name="content-type">application/xml; charset=UTF-8</str>
</queryResponseWriter>
<queryResponseWriter name="json" class="solr.JSONResponseWriter">
......

Guardados el archivo y ahora debemos cambiar “_text_” por “body” dentro de solrconfig.xml

# sed -i 's/_text_/body/ig' solrconfig.xml

Una vez esto hecho, tendremos que reiniciar Solr

# /etc/init.d/solr restart

Solr revisará schema.xml y generará un nuevo managed-schema
Si todo es correcto, el core sería visible desde “http://localhost:8983/#/solr/dovecot”
Y con esto ya tenemos configurado nuestro “core” para Dovecot.

Ahora debemos configurar dovecot para que empiece a usar Solr para indexar y poder hacer búsquedas.
Editamos el archivo

# vi /etc/dovecot/conf.d/10-mail.conf

buscamos “mail_plugins” y lo modificamos:

mail_plugins = $mail_plugins fts fts_solr

Editamos el archivo

# vi /etc/dovecot/conf.d/90-plugin.conf
plugin {
fts = solr
fts_autoindex = yes
#fts_solr = break-imap-search url=http://localhost:8983/solr/dovecot/
fts_solr = debug break-imap-search url=http://localhost:8983/solr/dovecot/
}

Reiniciamos Dovecot

# /etc/init.d/dovecot restart

Después de esto debemos indexar el correo:

# doveadm -Dv index -A inbox

o por cuenta de correo:

# doveadm -Dv index -u usuario@dominio.com inbox

Para forzar la reindexación, esto solo indicará al sistema que puede reindexar:

# doveadm -Dv fts rescan -A

o por cuenta de correo:

# doveadm -Dv fts rescan -u usuario@dominio.com

después de esto ya se puede ejecutar el comando anterior de indexación.

Cada vez que dovecot recibe, modifica o borra un correo indicará automáticamente a Solr si tiene que indexarlo o borrarlo.

Solr será accesible desde cualquier parte (dominios, ips …), para evitar accesos no permitidos es recomendable limitarlo a localhost/127.0.0.1 con iptables:

iptables -A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 8983 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8983 -j DROP

¡Happy Searching!

*** Importante *** Solr es accesible por desde cualquier sitio y por cualquier aplicación por lo que no es recomendable instalarlo en un entorno compartido ya que otros usuarios podrían acceder a la información realizando búsquedas.

No se han encontrado entradas similares.


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *