MySQLで全文検索

MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について|blog|たたみラボ に書かれてた、MySQL のFULLTEXT インデクスを使って boolean mode でクエリをかけることで全文検索を実現する方法を試してみたよ。

  • match(col)against().. は前段階の絞り込みに使えるだけで、その直後に LIKE演算子やコード側で厳密なチェックを行わないといけない。
  • 検索キーワードが短すぎる場合や、除外(not like)だけの場合にはFULLTEXTインデクスによる絞り込みは使えないので結局全レコードを舐めることになる。
  • 最低語長はMySQLの設定で回避できるんだけど、ストップワードに関しては設定をいじるより、一部の単語には適当なsuffixをつけてしまう方が手っ取り早かった。

あとはやはり、分かち書き/n-gram化するときの正規化がキモになるね。特殊な世界では特殊な記号をたっぷり含んだテキストが出てくるので、正規化のポリシーはかなり結果に影響することがわかった。