« 足が疲れた | メイン | 記憶が… »

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

トラックバック

コメント