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

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

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