[groonga-dev,04840] Re: 参照されることが多い記事のスコアを上げたい

Back to archive index
shinonon shino****@jcom*****
2021年 3月 23日 (火) 13:48:53 JST


篠田です。

各務さんからいただいたアドバイスから、Messageidを別テーブルにしたとき
の使い方を考えてみました。一つ工夫した点は、Messageid テーブルに、top
という「TOPメールのMessageidを登録するカラム」を作ったことです。

table_create Messageid TABLE_HASH_KEY ShortText
table_create Mail TABLE_HASH_KEY Int64
column_create Mail subject COLUMN_SCALAR ShortText
column_create Mail messageid COLUMN_SCALAR Messageid
column_create Messageid id COLUMN_INDEX Mail messageid
column_create Messageid inreplyto COLUMN_SCALAR Messageid
column_create Messageid top COLUMN_SCALAR Messageid
column_create Messageid follow COLUMN_VECTOR Messageid

load --table Mail
[
	{"_key":1,"subject":"one","messageid":"<aaa @ zzz>"},
	{"_key":2,"subject":"one two","messageid":"<bbb @ zzz>"},
	{"_key":3,"subject":"one two three","messageid":"<ccc @ zzz>"},
	{"_key":4,"subject":"one two another","messageid":"<ddd @ zzz>"},
	{"_key":5,"subject":"one two three another","messageid":"<eee @ zzz>"},
]

# 実際には、メールを登録したときにMessageidにin-reply-toを登録し、
# 再帰的にin-reply-toをたどって follow を生成・登録し、top も登録する
# (その処理はメールが多くなるととても負荷が高くなりそう)

load --table Messageid
[
	{"_key":"<aaa @ zzz>","follow":'["<bbb @ zzz>","<ccc @ zzz>","<ddd @ zzz>"]',"top":"<aaa @ zzz>"},
	{"_key":"<bbb @ zzz>","inreplyto":"<aaa @ zzz>","follow":'["<ccc @ zzz>"]',"top":"<aaa @ zzz>"},
	{"_key":"<ccc @ zzz>","inreplyto":"<bbb @ zzz>","top":"<aaa @ zzz>"},
	{"_key":"<ddd @ zzz>","inreplyto":"<aaa @ zzz>","follow":'["<eee @ zzz>"]',"top":"<aaa @ zzz>"},
	{"_key":"<eee @ zzz>","inreplyto":"<ddd @ zzz>","top":"<aaa @ zzz>"},
]

plugin_register 'functions/vector'

select Mail \
  --query 'subject:@one' \
  --scorer '_score=vector_size(messageid.follow)' \
  --output_columns 'subject,_score' \
  --drilldown messageid.top

#  [[[5],
#    [['subject', 'ShortText'], ['_score', 'Int32']],
#    ['one', 3],
#    ['one two', 1],
#    ['one two three', 0],
#    ['one two another', 1],
#    ['one two three another', 0]],
#   [[1], [['_key', 'ShortText'], ['_nsubrecs', 'Int32']], ['<aaa @ zzz>', 5]]]]

以上より、messageid.top=<aaa @ zzz> が 5 hit していて、そのときの _score 
の最大値=3 のメールが "one" で検索したときの最上位メールだということが
分かりました。
同様に、

select Mail \
  --query 'subject:@two' \
  --scorer '_score=vector_size(messageid.follow)' \
  --output_columns 'subject,_score' \
  --drilldown messageid.top

#  [[[4],
#    [['subject', 'ShortText'], ['_score', 'Int32']],
#    ['one two', 1],
#    ['one two three', 0],
#    ['one two another', 1],
#    ['one two three another', 0]],
#   [[1], [['_key', 'ShortText'], ['_nsubrecs', 'Int32']], ['<aaa @ zzz>', 4]]]]

以上より、messageid.top=<aaa @ zzz> が 4 hit していて、そのときの _score 
の最大値=1 のメール 2通が "two" で検索したときの最上位メールだというこ
とが分かりました。

実際には drilldown の結果が複数あるケースが多いので、そのときは個別に 
_score の最大値を調べることになりますが、その処理を一回の select で行
うことは可能でしょうか?


-- 
篠田 敦
shino****@jcom*****



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