2012/10/23

MySQL の FULLTEXT インデックス

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 件のコメント:

コメントを投稿