RastはIPAの平成16年度オープンソフトウェア活用基盤整備事業の一環としてRubyを筆頭にいろいろなオープンソースの港であるNaClで開発されている全文検索エンジン。ライセンスはGPL2だ。特徴は:
- n-gram式で高精度
- コマンドラインのツールを含まない純粋なライブラリ
- C、Ruby, Perl, PHPのバインディングが存在
- APIはとてもシンプルで簡単に使える
- バックエンドはBerkley DBM
Slashcode的にはPerlバインディングが存在するのがポイントが高い。が、Berkley DBMがバックエンドということは排他処理の問題で実質的にNFSでindexを共有して複数のフロントエンドサーバーが並列に検索する処理分散の方法が取れないし、複数のサーバーからindexに書き込むというのはもっと危険だ。もし使うなら、Ruby APIでも使って、簡単な常駐型のXML-RPCサーバでも立てる必要アリ
最終的には約1万のストーリー、30万の日記、70万のコメントが検索対象になるので、パフォーマンス的には初期のIndex作成が現実的な時間で作成でき、検索と単エントリの登録とがまあまあの時間(0.5秒いないとか)でできればいい。
ベンチマークとしてはindexerの性能を見るために、日記エントリを1万個づつ登録していき、かかった時間とindexサイズを求め、同じ検索を成長していくindexにたいして発行した。
Rastの場合:
 
Journals indexing:
 10000 entries:  2m39sec
+10000 entries:  7m24sec
========================
 20000 entries: 10m06sec    (117MB)
+10000 entries: 13m03sec
========================
 30000 entries: 23m09sec    (163MB)
+10000 entries: 24m12sec
========================
 40000 entries: 47m21sec    (206MB)
(中断)
 
Journals search "foo"
 10000 entries 0.04sec  (17hits)
 20000 entries 0.03sec  (34hits)
 30000 entries 0.07sec-0.12sec (55hits)
 40000 entries 0.07sec-0.13sec (75hits)
 
index成長率も検索時間の悪化も悪くはない感じだが、いかんせindex作成時間がエントリ数増加にともない激しく延びていくので、とてもじゃないが数十万の文書をindexする気になれない。1万のストーリーだけなら、APIのシンプルさからRastを使うのだがなぁ。