[groonga-dev,02735] Re: Mroonga スコアリングについて

Back to archive index

Kouhei Sutou kou****@clear*****
2014年 9月 1日 (月) 19:35:06 JST


須藤です。

In <64A69****@yjwex*****>
  "[groonga-dev,02731] Mroonga スコアリングについて" on Mon, 1 Sep 2014 04:22:10 +0000,
  Satoshi Mitani <samit****@yahoo*****> wrote:

> Mronnga を検証しておりまして、ドキュメントに記載されている内容と異なる挙動がありました。

報告ありがとうございます!

> http://mroonga.org/ja/docs/reference/full_text_search/scoring.html
> に記載されている、「4.重みが大きい上位N個のトークンを取り出す」のステップで、「明日」だけが残るという認識なのですが、
> 実際は、「天気」も対象になっているようです。

次のSQLで確認しました!
具体的なSQLも提示してもらえたので再現SQLを作りやすかったです。
ありがとうございます。

--
SET GLOBAL mroonga_default_parser = "TokenMecab";

DROP TABLE IF EXISTS groonga_test2;

CREATE TABLE groonga_test2 (
  id int(11) NOT NULL DEFAULT '0',
  keywords varchar(64) DEFAULT NULL,
  PRIMARY KEY (id),
  FULLTEXT KEY keywords (keywords)
) ENGINE=Mroonga DEFAULT CHARSET=utf8 COMMENT 'engine "InnoDB"';

INSERT INTO groonga_test2 VALUES(1, "明日は明日の風が吹く。");
INSERT INTO groonga_test2 VALUES(2, "また明日ね");
INSERT INTO groonga_test2 VALUES(11, "ひどい天気.");
INSERT INTO groonga_test2 VALUES(12, "快晴の天気");
INSERT INTO groonga_test2 VALUES(13, "のどかな天気");
INSERT INTO groonga_test2 VALUES(14, "蒸し暑い天気");
INSERT INTO groonga_test2 VALUES(15, "天気が穏かになる");
INSERT INTO groonga_test2 VALUES(16, "明日の天気が心配です。");

SELECT keywords, MATCH(keywords) AGAINST('明日の天気')
       FROM groonga_test2
       WHERE MATCH(keywords) AGAINST('明日の天気');
--

実際は、「天気も」ではなく、「天気だけ」対象になっていました。

ドキュメントでは「重みが大きい上位N個のトークン」と書いてい
ますが、実際は「トークンIDが大きい上位N個のトークン」という
挙動でした。

> バグでしょうか?アドバイスいただけると助かります。

ドキュメント通りの挙動にするには↓と変更すればよいのですが、
今の挙動が期待した挙動なのか、ドキュメントに書かれている挙動
が期待した挙動なのか、というところですね。

森さん、森さんがこのコードを書いた時、期待する挙動はなんだっ
たか覚えていますか?

--
diff --git a/lib/ii.c b/lib/ii.c
index d19049f..9679992 100644
--- a/lib/ii.c
+++ b/lib/ii.c
@@ -5702,7 +5702,7 @@ grn_ii_similar_search(grn_ctx *ctx, grn_ii *ii,
     grn_ii_cursor *c;
     grn_ii_posting *pos;
     grn_wv_mode wvm = grn_wv_none;
-    grn_table_sort_optarg arg = {GRN_TABLE_SORT_DESC, NULL, (void *)sizeof(grn_id), 0};
+    grn_table_sort_optarg arg = {GRN_TABLE_SORT_DESC|GRN_TABLE_SORT_BY_VALUE, NULL, (void *)sizeof(grn_id), 0};
     grn_array *sorted = grn_array_create(ctx, NULL, sizeof(grn_id), 0);
     if (!sorted) {
       GRN_LOG(ctx, GRN_LOG_ALERT, "grn_hash_sort on grn_ii_similar_search failed !");
--


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
  http://www.clear-code.com/services/code-reader/




groonga-dev メーリングリストの案内
Back to archive index