参考ページを基に、このページを書いています。
MySQLに保存されたデータを検索するには、select文のlikeを使う方法と、全文検索(FULLTEXT)を使う方法があります。
一般に、likeより、全文検索の方が、かなり、検索が速いようです。
MySQLには全文検索の機能がありますが、日本語は、そのままでは検索することができません。
全文検索は、単語を指定し、それに適合する文章を得る作業になります。英語の場合、文節(単語)の区切りはスペースであり、機械的に文章を文節に分解できますが、日本語の場合、文節の区切りがわかりにくく、文章を文節に分解しにくいためです。
例
This is a pen. -> This,is,a,pen
これは、ペンです。 -> これ,は,ペン,です
日本語でも、このように、文章を適切な文字列(単語など)に分解することができれば、全文検索を利用することができます。
分解する方法には、大きく分けて、2つの方法があります。
1.形態素解析(分かち書き)
形態素解析は、文章を単語に分解する方法です。
例文:今日は良い天気だ
例文を、以下のように分解できれば、名詞、動詞などに整理でき、理想的です。
今日,は,良い,天気,だ
kakasiやMeCabなどのプログラムを使うことで、このように分解することができます。
また、言葉の意味に関係なく、単純に、ひらがな、漢字、カタカナなどで分解する方法も考えられます。この場合、例文は、以下のようになります。この方法の欠点は、ワイヤレスマウスという言葉は、これで1つの単語になるため、マウスで検索してもヒットしないことです。
今日,は,良,い,天気,だ
2.Ngram
例文を以下のように分解する方法です。この例では、2文字で区切っていますが、3文字で区切ってもかまいません。
例文:今日は良い天気だ
今日,日は,は良,良い,い天,天気,気だ
検索語が、「良い天気」であれば、これも同様に分解し、「良い,い天,天気」の3つの文字列が一致する文章を検索することになります。
レンタルサーバで全文検索を使うには、どうすれば良いか
レンタルサーバの場合、使える言語は、PerlかPHPに、ほぼ限られます。
PHPで、形態要素解析を行うには、外部のプログラムを呼び出すか、外部のサイトのサービスを利用するなど、やや面倒です。簡単に調べた範囲では、PHPの形態要素解析ライブラリは見つかりませんでした。
簡易的に、漢字、ひらがな、カタカナ、アルファベットで分解する方法は試してみましたが、「ワイヤレスマウス」に対して、「マウス」では検索できない欠点がありました。
参考にしたページ(たたみラボ)のように、Ngramを使う方が良いと思います。
参考ページのままでは、いくつか不都合を感じましたので、以下、改良点を書いておきます。
MySQLの全文検索のデフォルトの設定では、4文字未満の単語は検索できません。レンタルサーバでは、この設定を変更できないため、この点に対策が必要です。
以下のように、アンダーバー(_)を加えて、4文字にすることで対応しました。
例文:今日は良い天気だ -> 今日__,日は__,は良__,良い__,い天__,天気__,気だ__
参考ページのコメント部分で議論されていますが、元のソースでは、「あいす」と検索すると、
against('+あい +いす', IN BOOLEAN MODE)
として検索されるため、「であい ないす」という言葉も引っかかります。以下のように修正すると、改善されます。
against('"あい いす"', IN BOOLEAN MODE)
XREAのサーバーでは、日本語の全文検索機能が期待通りに動きませんでした。
$ngram = mb_convert_encoding($ngram, 'HTML-ENTITIES', 'UTF-8');
のように英数字に変換することで、動くことを確認しています。
変換の方法は、上記のようなエンティティ変換の他にも、16進数へ変換するなど、いくつか方法はあると思います。