篠田です。
各務さんからいただいたアドバイスから、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*****