MySQLで全文検索 - FULLTEXTインデックスの基礎知識|blog|たたみラボ
MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について|blog|たたみラボ
誤検出の問題
「ワード」という文字列で検索したいので、次のようなクエリを投げると、このような結果が…。おおう…。
SELECT * FROM words WHERE MATCH (ngram) against ('+ワー +ード' IN BOOLEAN MODE); +----+--------------+---------------------------+ | id | name | ngram | +----+--------------+---------------------------+ | 1 | ワードプレス | ワー ード ドプ プレ レス | | 2 | ロードワーク | ロー ード ドワ ワー ーク | +----+--------------+---------------------------+ 2 rows in set (0.00 sec)
「ロードワーク」という言葉に「ワード」という文字列は含まれていないのですが、分かち書きにすると「ワー」「ード」という文字がいずれも含まれているので、誤ってヒットしてしまいます。
回避方法
LIKE の重ねがけでOK。あらかじめ FULLTEXT インデックスの MATCH 検索でレコードを絞り込んでいるので、LIKE 検索をかけてもあまり遅くなりません(もちろん FULLTEXT で充分に絞り込まれている必要があります。最終的な解決は mroonga で)。
SELECT * FROM words WHERE MATCH (ngram) against ('+ワー +ード' IN BOOLEAN MODE) AND name LIKE '%ワード%'; +----+--------------+---------------------------+ | id | name | ngram | +----+--------------+---------------------------+ | 1 | ワードプレス | ワー ード ドプ プレ レス | +----+--------------+---------------------------+ 1 row in set (0.00 sec)
InnoDBでも使えるようになった
便利きわまりない FULLTEXT インデックスですが、MyISAM でしか使えないのが悩みの種でした。が、MySQL 5.6 からは、InnoDB でも FULLTEXT インデックスが利用できるようになりました。
0 件のコメント:
コメントを投稿