全文検索とは特定のキーワードを含むテキストを、インデックスを使用して検索することです。RDBMSにおいて一般的に使用されるBtreeインデックスは、ID、名前、商品名、日付といった主にデータ長の短いカラムにおいて使用されますが、全文検索に使用するFULLTEXTインデックスは商品の説明文、Eメールの本文といった長いテキストを格納しているカラムに対して使用されます。
長いテキストを格納しているテーブルから特定のキーワードを含むテキストを検索するには、通常の検索と同様に以下のようなSQL文を実行することで、検索することも可能です。
しかしながら、このような部分一致検索の場合には、インデックスを使用した検索ができず、検索速度が遅くなってしまいます。百科事典を巻末の索引を使用せずに、1ページ目から順番に読んでいくようなものです。
一方、以下のようなSQL文を実行する全文検索においては、FULLTEXTインデックスを使用した検索ができる為、非常に高速です。
現在、MySQLには日本語環境で使用するための十分な全文検索機能が実装されていません。
例えば英語の場合、以下のように全文検索をすることができますが
日本語の場合、結果が0 件になってしまいます。
なぜこのようなことが起きるかというと、これはMySQLの全文検索(FULLTEXT)インデックスのキーワード抽出を行うパーサが「半角スペースで区切られているものをキーワードとして認識する」という実装になっているためです。欧米の言語は通常、単語と単語の間は半角スペースで区切られていますので機能しますが、日本語の場合はそうではないためキーワードの抽出を行えません。
例えば、「私はペンを持っています。」を例にすると、あらかじめ「私は ペンを 持って いま す。」のように半角スペースで区切っておけば(分かち書きと言います)現在のMySQLでも日本語全文検索を行うことができます。しかしMySQLに入力するデータをあらかじめ分かち書きするのは、その分処理が増えるのでできれば避けたいですし、オリジナルのデータと別に分かち書きしたデータを用意しなければならないのは効率が良くありません。
このような問題点はMySQL+Sennaの組み合わせで、解決することができます。 Sennaとはオープンソースの全文検索エンジンです。Sennaを使用することで、全文検索インデックスのキーワード抽出にあたって、形態素解析(mecabを使用)やn-gramといった手法が使用できる為、MySQLにおいても日本語のテキストに対して有効なインデックスを作成することが可能となります。
加えて、Sennaは以下の様な特徴を持っています。
MySQLにSennaを組み込むには、MySQLのソースコードにパッチをあて、修正を加える必要があります。これにより、FULLTEXTインデックスの処理にMyISAMのビルトインのFULLTEXTインデックスではなく、Sennaを使うようになります。MySQLにSennaを組み込んだ場合のSennaの位置づけは以下の図の様なイメージとなります。
Tritonn とは、MySQLに全文検索エンジンのSennaを組み込むためのパッチ(以下、MySQL バインディングパッチ)を開発する、オープンソースプロジェクトです。従来MySQL バインディングパッチは、Senna プロジェクトによって提供され てきましたが、2007年3月よりSennaのサブプロジェクト"Tritonn"として独立して開発、管理されています。また、MySQL+Sennaを実現するTritonnの使用方法についても詳しく解説されています。