--adjuster
によるスコア調整
Groongaのselectコマンドにはadjusterと呼ばれるスコア調整の仕組みがあります。
これは、カラムやインデックスを検索し、スコアのみを加算するものです。
--adjuster
は、--query
や--filter
の実行後に評価されるため、adjuster
によるスコアだけでなく、
クエリ検索時のマッチスコアも加算されてしまいます。
adjuster
によるスコアを重要視したいときに、マッチスコアが非常に大きくなると調整しにくいことがあります。
下記の例では、tags
にある重みよりも、body
の出現回数が多い方のスコアが高くなってしまっています。
body
がとても大きいようなケースでは1000や10000以上になることもあるでしょう。
table_create Tags TABLE_PAT_KEY ShortText
[[0,0.0,0.0],true]
table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
[[0,0.0,0.0],true]
table_create Memos TABLE_NO_KEY
[[0,0.0,0.0],true]
column_create Memos body COLUMN_SCALAR ShortText
[[0,0.0,0.0],true]
column_create Memos tags COLUMN_VECTOR|WITH_WEIGHT Tags
[[0,0.0,0.0],true]
column_create Tags memos_tags COLUMN_INDEX|WITH_WEIGHT Memos tags
[[0,0.0,0.0],true]
column_create Terms index COLUMN_INDEX|WITH_POSITION Memos body
[[0,0.0,0.0],true]
load --table Memos
[
{
"body": "Groonga Groonga Groonga Groonga Groonga Groonga Mroonga",
"tags": {
"groonga": 2
}
},
{
"body": "Groonga Groonga Mroonga",
"tags": {
"groonga": 5
}
}
]
[[0,0.0,0.0],2]
select Memos --match_columns 'body' \
--query "groonga" \
--adjuster 'tags @ "groonga"' \
--output_columns body,_score
[
[
0,
0.0,
0.0
],
[
[
[
2
],
[
[
"body",
"ShortText"
],
[
"_score",
"Int32"
]
],
[
"Groonga Groonga Groonga Groonga Groonga Groonga Mroonga",
9
],
[
"Groonga Groonga Mroonga",
8
]
]
]
]
body
の出現回数よりもtags
の重みを重視したいような場合は、以下のようにmatch_columns
にscorer_tf_at_most
スコアラー関数を適用すると
クエリ検索によるマッチスコアを0もしくは所定の上限値に抑えることができます。
select Memos \
--match_columns 'scorer_tf_at_most(body, 0)' \
--query "groonga" \
--adjuster 'tags @ "groonga"' \
--output_columns body,_score
[
[
0,
0.0,
0.0
],
[
[
[
2
],
[
[
"body",
"ShortText"
],
[
"_score",
"Int32"
]
],
[
"Groonga Groonga Groonga Groonga Groonga Groonga Mroonga",
3
],
[
"Groonga Groonga Mroonga",
6
]
]
]
]
これによりmatch_columns
とquery
のスコアは0に抑えられ、adjuster
のスコアのみが適用されました。
なお、この方法で抑えられるのは、--query
によるスコアのみです。--filter
によって加算されるスコア
は調整できません。
filter
によるスコアの影響を抑えるには、adjuster
の係数を少し大きくすることによって調整する必要があるかもしれません。
--scorer
によるスコア調整
adjuster
はカラムやインデックスを検索することによりスコアを加算することができますが、単純にカラムに入っている値をスコアに加算したい
ような場合は、--scorer
を使うことができます。
この--scorer
は、--adjuster
の調整後に評価されるため、--adjuster
の前にスコアをリセットする用途で利用することはできません。
table_create Tags TABLE_PAT_KEY ShortText
[[0,0.0,0.0],true]
table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
[[0,0.0,0.0],true]
table_create Memos TABLE_NO_KEY
[[0,0.0,0.0],true]
column_create Memos body COLUMN_SCALAR ShortText
[[0,0.0,0.0],true]
column_create Memos tags COLUMN_VECTOR|WITH_WEIGHT Tags
[[0,0.0,0.0],true]
column_create Memos some_score COLUMN_SCALAR Int32
[[0,0.0,0.0],true]
column_create Tags memos_tags COLUMN_INDEX|WITH_WEIGHT Memos tags
[[0,0.0,0.0],true]
column_create Terms index COLUMN_INDEX|WITH_POSITION Memos body
[[0,0.0,0.0],true]
load --table Memos
[
{
"body": "Groonga Groonga Groonga Groonga Groonga Groonga Mroonga",
"tags": {
"groonga": 2
},
"some_score": 100
},
{
"body": "Groonga Groonga Mroonga",
"tags": {
"groonga": 5
},
"some_score": 10
}
]
[[0,0.0,0.0],2]
select Memos \
--match_columns 'scorer_tf_at_most(body, 0)' \
--query "groonga" \
--adjuster 'tags @ "groonga"' \
--scorer '_score += some_score' \
--output_columns body,_score
[
[
0,
0.0,
0.0
],
[
[
[
2
],
[
[
"body",
"ShortText"
],
[
"_score",
"Int32"
]
],
[
"Groonga Groonga Groonga Groonga Groonga Groonga Mroonga",
103
],
[
"Groonga Groonga Mroonga",
16
]
]
]
]