This documentation is for Dovecot v2.x, see wiki1 for v1.x documentation.

Solr Full Text Search Indexing

Solr is a Lucene indexing server. Dovecot communicates to it using HTTP/XML queries.

Compiling

Give --with-solr parameter to configure script. You'll also need to have libexpat and libcurl installed (if packages do not exist dovecot will compile without solr support). YUM: expat-devel, curl-devel

Configuration

Replace Solr's existing solr/conf/schema.xml using doc/solr-schema.xml from Dovecot. You may want to check if the file contains something you want to modify. See Solr wiki for how to configure it.

On Dovecot's side add:

Into 10-mail.conf (note add existing plugins to sting)

mail_plugins = fts fts_solr

Into 90-plugins.conf

plugin {
  fts = solr
  fts_solr = url=http://solr.example.org:8983/solr/
}

Fields listed in fts_solr plugin setting are space separated. They can contain:

Important notes:

Solr commits & optimization

Solr indexes should be optimized once in a while to make searches faster and to remove space used by deleted mails. Dovecot never asks Solr to optimize, so you should do this yourself. Perhaps a cronjob that sends the optimize-command to Solr every n hours.

With v2.2.3+ Dovecot only does soft commits to the Solr index to improve performance. You must run a hard commit once in a while or Solr will keep increasing its transaction log sizes. For example send the commit command to Solr every few minutes.

# Optimize should be run somewhat rarely, e.g. once a day
curl http://<hostname/ip>:<port|default 8983>/solr/update?optimize=true
# Commit should be run pretty often, e.g. every minute
curl http://<hostname/ip>:<port|default 8983>/solr/update?commit=true

Re-index mailbox

If you require to force dovecot to reindex a whole mailbox you can run the command shown, this will only take action when a search is done and will apply to the whole mailbox.

doveadm fts rescan -u <username>

If you want to index a single mailbox/all mailboxes you can run the command shown, this will happen immediately and will blocking until action is completed.

doveadm index [-u <user>|-A] [-S <socket_path>] [-q] [-n <max recent>] <mailbox mask>

Sorting by relevancy

Solr/Lucene supports returning a relevancy score for search results. If you want to sort the search results by the score, use Dovecot's non-standard X-SCORE sort key:

1 SORT (X-SCORE) UTF-8 <search parameters>

Indexes

Dovecot creates the following fields:

Lucene does duplicate suppression based on the "id" field, so even if Dovecot sends the same message multiple times to Solr it gets indexed only once. This might happen currently if multiple searches are started at the same time.

You might want to build a cronjob to go through the Lucene indexes once in a while to delete indexed messages (or entire mailboxes) that no longer exist on the filesystem. It shouldn't normally find any such messages though.

Testing

# telnet localhost imap
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS STARTTLS AUTH=PLAIN AUTH=LOGIN] I am ready.
1 login username password
2 select Inbox
3 SEARCH text "test"

Sharding

If you have more users than fit into a single Solr box, you can split users off to different servers. A couple of different ways you could do it are:

External Tutorials

External sites with tutorials on using Solr under Dovecot

Plugins/FTS/Solr (last edited 2013-10-29 17:55:21 by TimoSirainen)