コメント
サイト運営のための寄付
作成者: 白鷹2
ページ番号: 1228093883_1228216258
作成日: 2008-12-02
修正日: 2008-12-02
MySQLで全文検索
MySQLで日本語の全文検索
参考ページを基に、このページを書いています。

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進数へ変換するなど、いくつか方法はあると思います。
©2008-2009 PostTips All Rights Reserved.
新規ページの作成
タイトル:
要約
新規画像の登録
タイトル:
画像ファイルの指定
タイトルの修正
画像タイトルの修正
要約の修正
コメントの書き込み
コメント: