MySQLで全文索引

今のところ特に使う必要もないんだけど、MySQLにて全文索引が使用できるように構築しておく。MySQLには元々FULLTEXT INDEXという全文索引は準備されているが、この索引はスペース区切りの文字列に対して使用する事を前提としている。例えば英文などであればそのまま使用できるが、日本語の場合は形態素解析して文節ごとにスペースを挿入する必要がある。その場合、元の文章と全文索引用の文章を別に保管するなどの工夫が必要になるため、運用上いろいろと面倒である。

そこで登場するのがsennaである。sennaは上記のスペース区切りの全文索引や、形態素解析した全文索引、n-gramと呼ばれるn文字単位でインデクシングする全文索引など、一般的に使用するものは全て準備されている。この機能をMySQLから利用するにはtritonnを使う事になる。こちらのプロジェクトでrpm化されたパッケージも配布されているが、今回はsenna以外にもopensslによる暗号化通信を組み込みたいのでソースからビルドする。tritonnパッチが当てられたMySQLソースをここからダウンロードする。

まず大前提としてsennaは64bit OSで使用する。以前のバージョン(数年前だけど・・・)で無理矢理32bit OSで試してみた事もあったが、インストールか運用かで相当苦労し最終的に諦めた覚えがある。次に、形態素解析で利用するmecabをインストールする。文字コードはEUC-JPをデフォルトにする予定なので、mecabもEUC-JPでmakeしておく事。そして、このmecabを利用する形でsennaをインストールする。mecabのインストール先に注意して、きちんとmecab-configのパスを指定する。

最後にMySQLをインストールする。この際にも、mecabやsennaのパスを指定する事を忘れないように。今回は更にEUC-JPを使う事やopensslを組み込む事も追加する。無事にインストールできたら、全文索引つきのテーブルを作成してみよう。全文索引の状態は『show senna status;』で確認出来る。また、my.cnfに『senna-log』と指定する事で、デバッグ用のログを吐かす事も出来る。最新のバージョンについてはまだ未確認だが、以下のような問題ではまった事がある。

  • USING指定を省略した場合のデフォルト索引がバージョン毎に異なる
  • mysqldumpした際にUSING句の指定が抜ける
  • create tableとcreate fulltext indexした場合でnormalize(大文字小文字判別)の指定が異なる

こういう細かい部分の修正と、MyISAMでしか使えない事、スコアリングの機能が弱い辺りが強化されると、更に使い易くなるだろう。今後の発展に期待が高まる。以下、参考までに。

  • mecabのインストールと構築
  • sennaのインストールと構築
  • MySQLのインストールと構築

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)