2010年6月17日木曜日

全文検索とmecab

今、いろんな仕事と平行して走ってるプロジェクトがあって、そこではpostgresqlで全文検索を行うために mecab を使ってアレコレしてる。
この全文検索、なかなかクセ者で、明らかにマッチするであろう単語は期待通りにマッチすることが多い。
でも、マッチしないであろう単語が意外にもマッチしてしまったり、期待してたのと違うレコードがマッチしたりするから、さあタイヘン。

今朝クレームが来たのは、「ほげほげ」って入れて検索すると何にもマッチするはずないのに180件もヒットしたんですけど!っていう内容。
で、ちょこっと調べてみた。

[psql]
database=# explain select keyword from csv_data_rows__2 where to_tsvector('japanese', keyword) @@ to_tsquery('japanese', 'ほげほげ');
QUERY PLAN
-------------------------------------------------------------------------------------------------
Bitmap Heap Scan on csv_data_rows__2 (cost=44.78..247.91 rows=57 width=226)
Recheck Cond: (to_tsvector('japanese'::regconfig, c29) @@ '''ほる'' & ''ほる'''::tsquery)
-> Bitmap Index Scan on idx_csv_data_rows__2_gin (cost=0.00..44.77 rows=57 width=0)
Index Cond: (to_tsvector('japanese'::regconfig, c29) @@ '''ほる'' & ''ほる'''::tsquery)
(4 rows)

「ほげほげ」が「ほるほる」に変化しとるwww
んじゃぁってんでmecabに直接かけてみた。

sh-# echo ほげほげ | mecab
ほ 動詞,自立,*,*,五段・ラ行,体言接続特殊2,ほる,ホ,ホ
げ 名詞,接尾,一般,*,*,*,げ,ゲ,ゲ
ほ 動詞,自立,*,*,五段・ラ行,体言接続特殊2,ほる,ホ,ホ
げ 名詞,接尾,一般,*,*,*,げ,ゲ,ゲ
EOS

ふむふむ。
コレによると、「ほげほげ」っていうワードは分解、解析されて、たいていの「ほ」からはじまる単語にマッチしてしまいそうだ。
単純に「ほ」で検索した場合よりも件数が少ないので、他にも条件はあるんだろうけど。

辞書をマッシュアップすればマシになるんだろうけど、そこまでする仕事じゃないしな。

「仕様です」で乗り切ろう。

0 件のコメント:

コメントを投稿