Dovecot でメールの全文検索を行う

# 設定手順

以下の記述は、Dovecot-2.3.4 および Debian10 (Buster) を前提としている。

必要なパッケージをインストールする。

```shell-session
apt install solr-jetty dovecot-solr poppler-utils catdoc 
```

以前の jetty パッケージとは異なり、Buster の jetty9 パッケージは `/etc/default/jetty9` を編集しなくても、標準で jetty が立ち上がるらしい。ポートは一般的な 8080/tcp なので、他と衝突する場合には変更が必要そう。

```shell-session
$ ps ax | grep jetty
 7406 ?        Ssl    1:59 /usr/bin/java -Djetty.home=/usr/share/jetty9 -Djetty.base=/usr/share/jetty9 -Djava.io.tmpdir=/tmp -jar /usr/share/jetty9/start.jar jetty.state=/var/lib/jetty9/jetty.state jetty-started.xml
$ sudo netstat -nap | grep 7406
tcp6       0      0 :::8080                 :::*                    LISTEN      7406/java           
tcp6       0      0 ::1:8080                ::1:48790               ESTABLISHED 7406/java           
```

`/etc/solr/conf/schmea.xml` を以下のように編集して、メールの検索のために必要な属性を索引付けするように追加する。

```diff
--- a/solr/conf/schema.xml
+++ b/solr/conf/schema.xml
@@ -893,7 +893,18 @@
        when adding a document.
    -->
 
-   <field name="id" type="string" indexed="true" stored="true" required="true" /> 
+   <field name="id" type="string" indexed="true" stored="true" required="true" />
+   <field name="uid" type="long" indexed="true" stored="true" required="true" />
+   <field name="box" type="string" indexed="true" stored="true" required="true" />
+   <field name="user" type="string" indexed="true" stored="true" required="true" />
+   <field name="hdr" type="text_cjk" indexed="true" stored="false" />
+   <field name="body" type="text_cjk" indexed="true" stored="false" />
+   <field name="from" type="text_general" indexed="true" stored="false" />
+   <field name="to" type="text_general" indexed="true" stored="false" />
+   <field name="cc" type="text_general" indexed="true" stored="false" />
+   <field name="bcc" type="text_general" indexed="true" stored="false" />
+   <field name="subject" type="text_cjk" indexed="true" stored="false" />
+
    <field name="sku" type="text_en_splitting_tight" indexed="true" stored="true" omitNorms="true"/>
    <field name="name" type="text_general" indexed="true" stored="true"/>
    <field name="alphaNameSort" type="alphaOnlySort" indexed="true" stored="false"/>
@@ -919,7 +930,7 @@
      multiple values for them.
    -->
    <field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/>
-   <field name="subject" type="text_general" indexed="true" stored="true"/>
+   <!-- <field name="subject" type="text_general" indexed="true" stored="true"/> -->
    <field name="description" type="text_general" indexed="true" stored="true"/>
    <field name="comments" type="text_general" indexed="true" stored="true"/>
    <field name="author" type="text_general" indexed="true" stored="true"/>
```

メールの添付ファイルを読み込んで検索対象となる平文テキストを取り出すためのスクリプト [decode2text.sh](https://gist.github.com/tsuchm/c6be8ef5f92afe8c4c8e7c8861972950) を `/etc/dovecot/` 以下に配置しておく。
fts プラグインの設定を、以下のように行う。

```conf:/etc/dovecot/conf.d/90-plugin.conf
plugin {
  #setting_name = value
  fts = solr
  fts_solr = url=http://localhost:8080/solr/
  fts_decoder = decode2text
  fts_autoindex = yes
}

service decode2text {
  executable = script /etc/dovecot/decode2text.sh
  user = nobody
  unix_listener decode2text {
    mode = 0666
  }
}
```

後半部分が、平文テキストを取り出すための設定である。このように設定すると、Dovecot は `/var/run/dovecot/decode2text` で待ち受ける decode2text サービスを用意する。fts は、到着したメールを decode2text に投入して平文テキストを抽出し、solr に渡して索引化することになる。

`/etc/dovecot/conf.d/10-mail.conf` を編集して、fts プラグインを有効化する。

```conf:/etc/dovecot/conf.d/10-mail.conf
mail_plugin_dir = /usr/lib/dovecot/modules
mail_plugins = fts fts_solr
```

最後に、dovecot および jetty を適宜に再起動する。

# インデックスの再作成

既存のインデックスを破棄する。

```shell-session
# doveadm fts rescan -u username
```

その上で、インデックスを再作成する。

```shell-session
# doveadm index -u username INBOX
```

# 参考文献

 * [Dovecot と Apache Solr で受信したメールを全文検索](http://tkusano.asablo.jp/blog/2013/01/04/6680218)
 * [Dovecot FTS + Apache Solr](https://fumiyas.github.io/dovecot/fts-solr.html)
 * [Solr Full Text Search Indexing](https://wiki2.dovecot.org/Plugins/FTS/Solr)