Sennaは組み込み型の全文検索エンジンです。DBMSやスクリプト言語処理系等に組み込むことによって、その全文検索機能を強化することができます。 n-gramインデックスと単語インデックスの特徴を兼ね備えた、高速かつ高精度な転置インデックスタイプのエンジンです。コンパクトな実装ですが、大規模な文書量と検索要求を処理できるように設計されています。また、純粋なn-gramインデックスの作成も可能です(Sennaサイトより引用)

MySQLで TEXTフィールド等を全文検索をする際に FULL TEXT INDEXをつけますが、日本語だと機能しません。Sennaはその辺の機能を提供してくれます。

とりあえず Fedora Core サイトから MySQLのSRPMをダウンロードしまして、 Sennaサイトのインストール情報を基に ビルドし、うまくいきました。今回はmecabを使う設定でのビルド。

適当に DBとテーブルを作り、100文字程度のテキスト x 100万件をインサート。テキストは某掲示板から持ってきたものを適当に切り抜いて作りました。

select * from test where match ( val ) against ( 'です' );

こんな感じで 検索をかけましたら 0.02 秒位で結果が返ってきました(早い!)。さらに ソートをかけます。

select * from test where match ( val ) against ( 'です' ) order by id desc;

こんな感じです。そうしますと 0.3秒程度かかりました。 多少時間がかかるようですね。勿論 Sennaサイトにある パッチは当てて有ります。と思いましたら、利用するindexを指定しないといけないようです。

SELECT * FROM test force index(PRIMARY) WHERE match(val) against( 'です' ) order by id asc

こんな風にすると 0.05秒位で検索できました。

ただ結果が多い場合は出力で時間がかかります。件数が多くなるような場合は limitを入れないとキツイです。

何にしても素晴しいソフトウェアです。

今回実験した環境は

AthronXP 3200+ / 1G mem / Fedora Core 4/ MySQL 5.0.21 / mecab 0.9 / php 5.0.4

です。(2006/5/21)


Sennaはポスグレにも使えるようですが、ポスグレの場合は こんな のもあります。