この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
MYSQLで高速な日本語全文探索を実現するため、tritonnでMYSQL+Sennaにする。
■tritonnとは?
MySQLから全文検索エンジンSennaを利用可能にするための改造を行うプロジェクトのこと。
■Sennaってなんなの?
Sennaは組み込み型の全文検索エンジン。
■Sennaの特徴
・組込み型
MySQLに組み込んで使用する為、MySQLがアプリケーションからSennaを隠蔽します。
開発者の方はSQL文を操作するだけで、全文検索を実行できます。
・高速
キーワードがテキスト内のどの位置にあるかという位置情報を持った、
完全転置インデックスを採用している為、フレーズ検索においても高速な検索が可能です。
・即時検索
作成したインデックスに対して、インクリメンタルに文書の追加/変更/削除の操作を加えることができるため、
文書に次々と変更が加えられる場合にも、一度作成したインデックスを作成し直す必要がありません。
■なんでSennaをいれる必要あるの?
1. MySQLには日本語環境で使用するための十分な全文検索機能ができない。
・MySQLのFULLTEXTインデックスのキーワード抽出を行うパーサが、
「半角スペースで区切られているものをキーワードとして認識する」という実装になっているため。
・LIKE演算子による部分一致検索は可能だが、インデックスを一切使用することができなくなってしまうため、
テーブルのフルスキャンが発生します。
2. MYSQLでは全文検索を行うための実装面での十分な高速化が行われていない。
■toritonn 導入について
toritonnのダウンロードについて
http://qwik.jp/tritonn/download.html
toritonnのユーザガイド
http://qwik.jp/tritonn/userguide.html
■tritonnの2ind機能(2インデックス同時使用機能)
MySQLではクエリを実行する際、1つのテーブルに対してFULLTEXTインデックスと他のインデックスを組み合わせて利用することができません。
従ってFULLTEXTインデックスを用いる用いた場合、以下のような問題が生じます。
1. limit指定で出力を制限しても応答が遅い問題
2. count(*)等で件数を取得するだけでも応答が遅い問題
3. 全文検索以外の条件で絞り込む処理が遅い問題
4. 全文検索以外の条件でソートする処理が遅い問題
上記の問題を解決するために、MySQLが全文検索用のインデックスと通常のインデックスの両方を併用できるようにするのが2ind機能です。
■2ind利用法
Tritonnパッチをあてると、MySQLのサーバ変数(SESSIONスコープ)に”senna_2ind”という変数が追加されます。
下記のどちらかの方法で、2ind機能の利用を動的にOn/Offすることができます。
・my.cnfあるいはmysqldの起動オプションで”–senna-2ind”を指定する。
・SETコマンドでONを設定してください。→ mysql> SET SESSION senna_2ind=ON;
以下、公式より2ind機能使用について、注意書きがあります。
注意:2ind機能はまだ安定度合いとしてはβ段階にあります。
実際に利用する前に有効かどうか、利用環境で問題は無いかどうかをご確認の上、使用してください。
■参考文献
■Senna 組み込み型全文検索エンジン
http://qwik.jp/senna/FrontPageJ.html
■toritonnプロジェクト
http://qwik.jp/tritonn/
■toritonn ユーザガイド
http://qwik.jp/tritonn/userguide.html
■MySQLで全文検索 – FULLTEXTインデックスの基礎知識
http://www.tatamilab.jp/rnd/archives/000389.html