MySQLのFULLTEXTインデックスを使った全文検索は、日本語の場合はそのままでは使えません。
英文の空白を単語の区切りとした構造が前提となっている為だそうです。
しかし、MySQL 4.1.1 以降なら日本語でも単語の区切りに空白を入れる事が出来れば使えるのだそうです。
文字コードはUTF-8を使っていますから問題ありません。その他、SJIS、EUC-JPも使えるようです。
さて、 単語の区切りを見つけて空白等の区切り文字で分ける事を「分かち書き」と言うそうです。
この「分かち書き」をMySQLにお任せ出来るTritonn(全文検索エンジンSennaを組み込んだMySQL)が一番楽そうです。
しかし、MySQLをインストールし直す事になります。
今回は、既に使用しているMySQLをそのまま使う、という状況を想定してみます。
つまり、PHP側で分かち書きを行い、その結果をMySQLに収め、FULLTEXTインデックスを使って全文検索を行うということです。
但し、実装するにはroot権限が必要ですから、共用サーバ等では使えないケースが多そうです。
以下を参考にさせて頂きました。有り難うございます。
Tritonnプロジェクト
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
php_mecab-0.3.0: 某所より引っ越し - 讃容日記
Page2
ウノウラボ PHPとMecabでキーワード自動リンクを実装する
MySQLで全文検索 - FULLTEXTインデックスの基礎知識
Senna 組み込み型全文検索エンジン
分かち書きにMeCabを利用させて頂くことにしました。MeCabはSennaでも使われている形態素解析エンジンです。
PHPにはMeCabを使う為の拡張モジュールphp_mecabがあるそうです。
これらを使わせて頂いて、
1.MySQLのテーブルに分かち書きしたテキストを入れる項目を追加し、FULLTEXTインデックスを張っておく。
2.レコードの追加&変更前に、PHPでテキストを分かち書きする。
3.バッチ処理等で大量のレコードを追加&変更する時は、FULLTEXTインデックスを処理前に削除し、処理後に張り直すようにする。
4.検索対象文字列を分かち書きして検索。
という運用が出来るか試してみたいと思います。
FULLTEXTインデックスはMyISAM型のテーブルでしか使えません。
つまり、トランザクション処理をしたいテーブルには使えないということです。
一方、FULLTEXTインデックスの更新には時間が掛かるという問題も有ります。
そこで、分かち書きしたテキストだけを収めるMyISAM型のテーブルを別途用意することにしました。
例えば、InnoDB型の商品マスタに、「商品コード(PK)、商品名、値段、在庫数、説明文」の項目があり、「商品名、説明文」で全文検索を行うとします。
検索用商品マスタとして、MyISAM型で「商品コード(PK)、商品名、説明文」というテーブルを用意し、「商品名」と「説明文」にFULLTEXTインデックスを張ります。
この「商品名」と「説明文」には、分かち書きした「商品名」と「説明文」をテキストを収めます。
これで、「商品名」又は「説明文」に変更があった時だけ、FULLTEXTインデックスを張り直す事にもなります。
全文検索は、検索用商品マスタと商品マスタを内部結合して行います。検索用商品マスタは条件文にのみ使い、検索結果には商品マスタの項目を使えば、分かち書きしたテキストが表示されることはありません。
商品受注のトランザクション処理等では商品マスタだけを更新すれば良いので、トランザクション処理にも影響はありませんし、FULLTEXTインデックスを張り直すことにもなりません。
検索用商品マスタの例です。