サイトを作っていると全文検索機能を持たせたくなります。
というわけで、MySQLを使って全文検索機能を持つサイトを作ることを考えてみます。
今回はMySQLでの全文検索機能について書きます。
MySQLの全文検索機能は、英語のように単語を空白などで区切られていることを前提としています。
英文であれば、検索対象のカラムに対して、フルテキストインデックスを張ったうえで、
select *
from table_name
where match (column_name)
against(‘word1 word2 word3′)
のように書くと、なかなかの検索結果が表示されます。
ところが日本語でこれをやろうとするとひと工夫必要です。
英語と同じように文章を空白で区切ってあげる必要があります。
まず、単純に実行できる方法は、N-gramという方法です。これは、ある文字数で文章を区切ってあげることを言います。
たとえば、予定表テーブルの内容フィールドに「今日は大岡山で遊びます」という文章が登録されているとします。
そうしたら、予定表テーブルに内容検索フィールドを追加して、そこへ
今日 日は は大 大岡 岡山 山で で遊 遊び びま ます
のように区切ったデータを格納してフルテキストインデックスを設定します。
そこで、「よい天気」で検索する場合、「よい 天気」で検索します。
そうすれば、「よい」と「天気」で検索されるので、この文章がヒットします。
実はこれだけではヒットしません。MySQLはデフォルトでは3文字以下の文字列はキーワードとして認識させない方針のようです。ですから/etc/my.confへ
[mysqld]
ft_min_word_len=2を設定する必要があります。
この方法はシンプルではありますが、そこそこ良い結果をもたらします。
あとは、インデックス用のフィールドに対して旧字体から新字体(學→学)のように変換してから登録したり、全角と半角の統一を行っておくと、より良い精度が得られるかもしれません。