有没有办法为查询设置分数范围(或最高分数)
Is there a way to set a score range (or a max score) for a query
我有一个非常简单的查询:
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:",
[...]
你看到了吗,我的分数是11.38,因为IDF。
我的其他查询(分数在 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))",
}
},
}
它更好,但在某些情况下仍然可以取得很高的分数。
您是否尝试过使用函数评分查询?
这是相同的 link
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html
最后,我在 script_score
中使用 1 - (1/x)
函数和脚本分数一起使用函数分数
GET _search
{
"query": {
"function_score": {
"query": {
"match": {
"postgresql.log.message": "alter"
}
},
"script_score" : {
"script" : {
"params": {
"max_score": 5
},
"source": "params.max_score * (1 - 1 / _score)"
}
}
}
}
}
这样,我的分数就会在0到接近5之间(max_score)。
您可以 here 尝试使用单词 alter
(分数 3.9150627)或 alter table pgbench_branches add primary key (bid)
(分数 4.8539715)。
您可以调整 1 - (1/x)
函数以更快地接近渐近线。
我有一个非常简单的查询:
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:",
[...]
你看到了吗,我的分数是11.38,因为IDF。 我的其他查询(分数在 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))",
}
},
}
它更好,但在某些情况下仍然可以取得很高的分数。
您是否尝试过使用函数评分查询? 这是相同的 link https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html
最后,我在 script_score
1 - (1/x)
函数和脚本分数一起使用函数分数
GET _search
{
"query": {
"function_score": {
"query": {
"match": {
"postgresql.log.message": "alter"
}
},
"script_score" : {
"script" : {
"params": {
"max_score": 5
},
"source": "params.max_score * (1 - 1 / _score)"
}
}
}
}
}
这样,我的分数就会在0到接近5之间(max_score)。
您可以 here 尝试使用单词 alter
(分数 3.9150627)或 alter table pgbench_branches add primary key (bid)
(分数 4.8539715)。
您可以调整 1 - (1/x)
函数以更快地接近渐近线。