読者です 読者をやめる 読者になる 読者になる

LGTM

Looks Good To Me

古いメールを全文検索できるよう保存する

昔からのメールが溜まってて,検索できる状態で置いときたい.

  • 26GB
  • 85万通
  • Maildir 形式
  • IMAP サービスするのはアリ (dovecot が動いてる)

どんな検索エンジンを使うのがいいかを検討した.

ざっくり言うと

Xapian をバックエンドとするmu でインデックスして,サーバーサイドでmu4e をつかって検索するのがよさそう.

やりたいこと

  • 古いメールは,普段目に触れないようにしたい
  • 検索したい
  • 検索するのはまれなので,常駐プロセスを増やしたくない

候補

  • クライアント側で検索
  • サーバー側で検索
    • Lucene バックエンドなもの (Solr,Elasticsearch など)
    • Xapian バックエンドなもの (mu など)

比較

古いメールの一部を使って試す.

  • 930MB
  • 2.5万通

クライアント側で検索

(MacBook Pro - Retina, Mid 2012)

慣れたメールアプリで検索できるが,インデックスするのにダウンロードが発生する.筋が悪い方法だけど いちおう試してみる.古いメールはIMAP で取ってくる.

インデックス時間 ダウンロード後のフォーマット ダウンロード後のサイズ インデックスサイズ
Mail.app 1時間 .emlx 1.3GB 22MB
Thunderbird 10分 mbox 890MB 55MB
  • Mail.app

    • インデックスするのが超絶遅い
    • ダウンロードして1メール1ファイルに保存するが,メタデータが大きくて1.4倍くらいディスクを食う.(もとは930MB) メタデータは700~800B あって,小さいメールが多い場合は2倍とかになるかもしれない
  • Thunderbird

    • インデックス時間も保存メールサイズも現実的

サーバー側で検索

(4 core 3.3GHz + 4GB RAM)

  • Lucene ベースのSolr,Elasticsearch はdaemon を常駐させないといけないので,今回の用途には合わない
  • Java 書いて直接Lucene 叩けばいけそう (やってない)
  • dovecot-lucene はアリかも (libc6 ごとアップグレードする必要があって試してない)
    • IMAP SEARCH にも対応できる
    • メモリを浪費する可能性ある
  • いっぽうXapian は常駐しないタイプのフロントエンドが充実
    • 今回はmu を試した
インデックス時間 ダウンロード後のフォーマット ダウンロード後のサイズ インデックスサイズ
mu 1分 - - 110MB

インデックスするには

$ mu index -m ~/Maildir

検索するには,CLI から

$ mu find ipv6
$ mu find from:\*gmail subject:ipv6

のようにするか,mu4e をつかう.

$ emacs -f mu4e

スクリーンショット:

気軽でいい感じ.

インデックス時のスワップに注意

メモリをじゃぶじゃぶ使うタイプのソフトウェアっぽくて,

$ mu index --xbatchsize 1000 -m ~/Maildir

のようにしてメモリ使用量を抑える必要があった.

インデックスの最適化
mv .mu/xapian .mu/xapian.old
xapian-compact .mu/xapian.old .mu/xapian
rm -rf .mu/xapian.old

インデックスサイズが3.4G → 2.2G まで小さくなった.

まとめ

下のどちらかがいいと思う.

  • Thunderbird に食わせて,サーバーからメールを消す
  • サーバー側に置いといて,mu か mu4e で検索する

将来dovecot-lucene を試してみたいので,後者を採用した.