【发布时间】:2017-12-11 10:42:53
【问题描述】:
我有一个非常简单的查询:
match: {
field => {
boost: 4,
query: term,
fuzziness: 'AUTO',
}
}
由几个(大约 10 个)其他查询组成,其中大多数使用 constant_score。问题是,在特定条件下,我的查询得分太大,会取消所有其他查询结果。
这里是解释的一部分:
"details" => [
[0] {
"value" => 63.656006,
"description" => "sum of:",
"details" => [
[0] {
"value" => 63.656006,
"description" => "weight(title.de:kandinsky in 1694239) [PerFieldSimilarity], result of:",
"details" => [
[0] {
"value" => 63.656006,
"description" => "score(doc=1694239,freq=1.0 = termFreq=1.0\n), product of:",
"details" => [
[0] {
"value" => 4.0,
"description" => "boost",
"details" => []
},
[1] {
"value" => 11.3820715,
"description" => "idf, computed as log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) from:",
[...]
你看到了吗,由于 IDF,我得到了 11.38 的分数。 我的其他查询(分数在 1 到 3 之间)完全没用。
我的问题是:
如何设置查询的最大可能分数?
或者,更好的是,我可以为我的查询设置分数范围吗?
我想避免对该字段进行 constant_score 查询,我需要一些 TF/IDF 和该字段的分数概念,但不是那么强。
我试过这个:
function_score: {
query: { match: {
field => term,
}},
score_mode: :avg,
script_score: {
script: {
inline: "4 * (1 + Math.log(2 + _score))",
}
},
}
更好,但在某些情况下仍然可以取得很高的分数。
【问题讨论】:
-
您好,您找到答案了吗?我想弄清楚我必须做些什么来解决这个问题,因为我希望我的分数在 0 到 1 之间。谢谢!
-
@christouandr7,我使用了函数分数和脚本分数,使用了
1 - (1/x)script_score。我将在下面发布完整答案 -
感谢您的更新!我有另一个问题。由于我得到的一些分数小于 1,因此使用此评分函数会产生问题。用你刚才写的函数,如果分数小于1,那么最后的分数就是负数!你知道如何处理吗?
-
@christouandr7 你可以这样调整函数:
1 - (1/( 1 +x)) -
我已将该函数调整为 1 - (1 / (10x))。它不是很敏感,但我的工作已经完成!也谢谢你的回答!
标签: ruby-on-rails elasticsearch elasticsearch-ruby