Als IMAP-Dienst verwende ich Dovecot. Als Mail-Benutzer bin ich ein ziemlicher Messie, da ich ungerne Mails lösche. Oft nutze ich meine Mailbox, um alte Vorgänge über meine alten Mails nachzuvollziehen. Und so kommt es auch, das mein Mail-Hauptordner meistens über 50.000 Mails beinhaltet. Eine Volltextsuche dauert leider im Normalfall mehrere Minuten. Einerseits stört natürlich die Suchdauer, andererseits ist so eine Suche hinsichtlich Server-Performance ziemlich verschwenderisch.
Der Mail-Dienst Dovecot bietet bereits einen Volltext-Index Dienst an – und zwar Full Text Search, kurz FTS. Hierfür gibt es eine Unterstützung für Solr. Dies ist ein in Apache Lucene integriertes Servlet und steht für Search on Lucene and Resin. Für die Solr-Unterstützung benötigt man also einen Apache-Tomcat. Die Grundinstallation unter Debian ist sehr einfach:
apt-get install solr-tomcat dovecot-solr
Mit dem Paket dovecot-solr wird im Grunde das richtige Schema für Dovecot bereitgestellt. Damit Solr das richtige Schema verwendet, muss es noch an die richtige Stelle kopiert werden:
cp /usr/share/dovecot/solr-schema.xml /usr/share/solr/conf/schema.xml
Damit der Tomcat nicht öffentlich verfügbar ist, wird der Listener noch auf Localhost angepasst. Dazu fügen wir beim Connector den Wert address=“127.0.0.1″ hinzu:
<Connector address="127.0.0.01" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
Anschließend einfach den Tomcat neustarten:
service tomcat8 restart
Nun haben wir Solr auf dem Tomcat mit dem richtigen Schema für Dovecot laufen. Nun widmen wir uns dem Dovecot. Dazu muss FTS und Solr in Dovecot aktiviert und eingerichtet werden. Dazu sind folgende Schritte in /etc/dovecot/dovecot.conf notwendig:
Laden der Plugins fts und fts_solr für jedes Protocol:
mail_plugins = ... fts fts_solr
Und noch die Konfiguration, damit Dovecot den Dienst unter http://localhost:8080/solr/ verwendet:
plugin { ... fts = solr fts_solr = break-imap-search url=http://localhost:8080/solr/ }
Nun kann ein erster Test erfolgen. Bei der ersten Suche wird der Index aufgebaut. Darum wird die erste Suche lange dauern. Danach ist der Index erstellt und die Suche ist optimiert. Eine Suche sieht im Tomcat Access-Log so aus:
127.0.0.1 - - [04/Oct/2017:15:44:44 +0200] "GET /solr/select?fl=uid,score&rows=126561&sort=uid+asc&q=%7b!lucene+q.op%3dAND%7d(hdr:sun+OR+body:sun)&fq=%2Bbox:xxx+%2Buser:xxx@netzdeponie.de HTTP/1.1" 200 626502
Bei diesem Test habe ich Header (hdr) oder (OR) Body nach dem Wert „sun“ gesucht. Nach dem der Index aufgebaut wurde, brauchte die Suche nur noch wenige Millisekunden. Damit die indizierte Suche weiterhin schnell bleibt, bedarf es einer regelmäßigen Optimierung. Dazu bietet sich folgender Cronjob an:
0 2 * * * kraut curl http://localhost:8080/solr/update?optimize=true >/dev/null 2>&1 0 * * * * kraut curl http://localhost:8080/solr/update?commit=true >/dev/null 2>&1