2007年08月01日
Tritonn による検索はスコア値でソートされない
最近は、徹夜しながら MySQL + Senna の Tritonn を試している。先日まで、Tritonn を利用した全文検索では、取り出した結果がスコア値でソート(適合度順)されるものだと思っていた。
すなわち、
SELECT * FROM table WHERE MATCH(col) AGAINST('*D+ 検索' IN BOOLEAN MODE);
というクエリを発行した場合、結果は TF-IDF に基づく順序だと思っていた。
これは、単なる思い込みで、正しくない。
SELECT *, MATCH(col) AGAINST('*D+ 検索' IN BOOLEAN MODE) FROM table WHERE MATCH(col) AGAINST('*D+ 検索' IN BOOLEAN MODE);
こうすればスコア値を表示できるので、スコア順でソートされていないことを確認できた。
sen_records_sort
また、MySQL + Tritonn のソースコード内で、ソートを行う Senna API が使われていないことも確認した。
ALTER TABLE table ORDER BY item_score DESC
事前に「アイテムの重要度」を決めるカラムでソートしておけば、全文検索の結果がアイテムの重要度(検索キーワードとの相関性を反映しない)でソートされるだろう。ただ、事前ソートがどこまで適用されるかがいまいち分からない(インデックスを利用した場合など)。
スコア順でソートしたい場合は、以下のようにクエリを発行すればよい。
SELECT *, MATCH(col) AGAINST('*D+ 検索' IN BOOLEAN MODE) AS score FROM table WHERE MATCH(col) AGAINST('*D+ 検索' IN BOOLEAN MODE) ORDER BY score DESC;
Tritonn のドキュメントが少ない状態なので、手探りで進めている。検証方法を確立しないと、大々的に日記に書くことが出来ないので、いつまでたってもメモなのだが。
【関連情報】
・[Senna-dev 624] Re: tritonnの近傍・関連文書検索について
http://lists.sourceforge.jp/mailman/archives/senna-dev/2007-June/000623.html
・Senna API解説 - Senna 組み込み型全文検索エンジン
http://qwik.jp/senna/APIJ.html
・12.1.2. ALTER TABLE 構文 - MySQL 5.1 リファレンスマニュアル
http://dev.mysql.com/doc/refman/5.1/ja/alter-table.html
2007年08月01日 23:47 | Technology