0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

設定手順

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

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

apt install solr-jetty dovecot-solr poppler-utils catdoc 

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

$ 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 を以下のように編集して、メールの検索のために必要な属性を索引付けするように追加する。

--- 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/etc/dovecot/ 以下に配置しておく。
fts プラグインの設定を、以下のように行う。

/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 プラグインを有効化する。

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

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

インデックスの再作成

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

# doveadm fts rescan -u username

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

# doveadm index -u username INBOX

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?