- 追加された行はこの色です。
- 削除された行はこの色です。
[[DataBase]]
MySQLで日本語の全文検索
カテゴリー:
* プログラミング
- face @ 05:01
MySQLで全文検索するには、
1. カラムに対して全文検索インデックス(FULLTEXT)を張ります
例)
ALTER TABLE ‘xoops_table’ ADD FULLTEXT (myindex);
2. insertやupdateすると、自動的にインデックス化されます
insert into xoops_table(myindex) values(’This is black ballpen.’);
3. 次に、MATCH … AGAINST 構文を使ったSELECT文で検索します
select * from xoops_table where match( myindex ) against( ‘black’ );
こんな感じの処理になります。
LIKE構文を使ったselect文と比較すると、数十倍高速なのです。
※関連記事の表示でも使用してます
■日本語で検索する場合
上の例で、select文に「against(’映画’)」と書いても、「映画」という文字列があったとしてもヒットしません。
そこでとりあえず簡単に日本語で検索してヒットさせるには
「IN BOOLEAN MODE」を使用すると日本語でもヒットします
例)
select * from xoops_table where match( myindex )
against(’映画’ IN BOOLEAN MODE);
■日本語での制限
これは私もハマったのですが、具体例で説明しますと
例)元テーブルの文字列
[映画] ナショナルトレジャー リンカーン暗殺者の日記.avi
ヒットする例:
・映画
・ナショナルトレジャー
・リンカーン暗殺者の日記
ヒットしない例:
・ナショナル
・トレジャー
・暗殺者
なぜ検索でヒットしたり、しなかったりするかというと
検索したい文字列の前後が半角文字ならヒットする
検索したい文字列の前後に日本語があるとヒットしない
という違いによるものだとわかりました。
つまり、インデックス(FULLTEXT)化する日本語の文字列は、
事前に形態素解析 (わかち書き)しておくとヒットするようになります。
わかち書きしておくことで
[ 映画 ] ナショナル トレジャー リンカーン 暗殺者 の 日記 . avi
こんな感じに バラバラになる >> 前後が半角文字になる >> ヒットする
というわけです。
■日本語で検索の応用
上の例では、半角スペースで区切ってありましたが
[ . : など、半角文字ならヒットしましたので、その仕様をうまく使えば
「日本語でWordPressの関連記事」を表示させることが出来ます。
RelatedEntriesは、本文中にキーワードを
<!−−kw=映画 トレジャー−−> という感じに登録すると、キーワードは登録されて
<!−−映画 トレジャー−−> のように文字列だけ本文に残ります。
そこで、あとでキーワードとしてヒットさせたい文字が本文中に残ります。
先ほどの説明の通り、キーワードの前後が半角です!
つまり、「映画」と「トレジャー」というキーワードは
関連する記事としてヒットするようになります。