MySQL全文検索 のバックアップ差分(No.1) - アールメカブ

アールメカブ


MySQL全文検索 のバックアップ差分(No.1)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[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=映画 トレジャー−−> という感じに登録すると、キーワードは登録されて
<!−−映画 トレジャー−−> のように文字列だけ本文に残ります。

そこで、あとでキーワードとしてヒットさせたい文字が本文中に残ります。
先ほどの説明の通り、キーワードの前後が半角です!

つまり、「映画」と「トレジャー」というキーワードは
関連する記事としてヒットするようになります。