2010-09-09

【MySQL】全文検索

MySQLには全文検索を行える機能がついてるのだけど、何らかのパッチを当てたり、違うシステムを組み込まないとマルチバイト文字(日本語もマルチバイ ト文字)が使えないのです。

さらに、MySQLの全文検索は結構制限があって、
 「検索文字は4文字以上」
 「50%以上のレコードがヒットすると、結果を返さない」
というちょっとひどい仕様になっています。

で、どうにかして「マルチバイト文字」の全文検索を「パッチを当てず」に使用したい。

50%の制限は、「IN BOOLEAN MODE」って指定をすると解除されるので問題ないのだけど、4文字制限がちときつい。
で、結構力技な方法を考えた。

以下が具体的な方法。
 1)FULLTEXTインデックスをはるカラムはLONGTEXTなどの大容量にしておく
 2)検索対象文字列を1文字ずつばらばらにしMD5でハッシュにする
 3)ハッシュを半角スペースで区切りカラムに保存

というように、結構簡単に「マルチバイト文字列」で「全文検索」が実現可能だった。ただしめちゃくちゃ容量を食うけどね。
日本語で1文字の検索でもハッシュ化すると半角32文字まで増えるのでMySQLの制限もクリア。

ハッシュ化する関数。引数$sourceはハッシュ化対象文字列。ちなみにエンコードはUTF-8です。
function make_search_token( $source )
{
  $chars = preg_split( '//u', $source );
  $temp_token = array();
  foreach( $chars AS $char ) {
    $temp_token[] = md5( $char );  
  }
  return implode( ' ', $temp_token );
}

多分、AND検索などの細かい指定は出来ないけど、ちょっと使う分には簡単で、便利だと思うがどうだろうか?

ZenBack

WebMoney ぷちカンパ