gpt4 book ai didi

elasticsearch - 避免ElasticSearch查询中的魔术数增加?

转载 作者:行者123 更新时间:2023-12-02 23:03:14 24 4
gpt4 key购买 nike

我希望从ElasticSearch查询生成的文档中,将字段(称为“fubar”)设置为在查询时确定的某些值,使其始终在未将fubar设置为这些值之一的文档之前出现。

例如,在查询时,我决定将fubar设置为1、5或10的文档排在所有其他文档之前。

现在,我通过使用function_score来过滤“在”值列表中的fubar并将过滤器的增强值设置为10倍,来实现此目的。然后将查询分数和该提升的滤波器相加。

感觉就像是骇客-我怎么确定不需要100倍增强?有没有做到这一点的“干净”方法,而该方法没有对最大可能文档分数进行假设?换句话说,有没有一种方法可以避免“神奇的”提升数字?

最佳答案

编辑:修改了查询排序以匹配OP的澄清问题。

{
"query" : {"match_all" : {}},
"sort" : [
{"_script" : {
"script" : "[1, 10, 15].contains(doc['fubar'].value.toInteger()) ? 1 : 0",
"type" : "number",
"order" : "desc"
}},
"_score"
]
}

这种排序依赖于指定的脚本来动态确定每个文档中的 fubar是否相应地等于1、10或15种排序。在此示例中,我选择将结果映射到1或0,但是我敢肯定还有很多其他方法可以使用。使用以下示例数据:
{"name":"Alice", "fubar":1}
{"name":"Bob", "fubar":21}
{"name":"Carol", "fubar":33}
{"name":"David", "fubar":17}
{"name":"Evelyn", "fubar":5}
{"name":"Fred", "fubar":10}

我得到以下结果(出于可读性考虑,截断了外部位):
"hits" : [ {
"_index" : "test",
"_type" : "test",
"_id" : "1",
"_score" : 1.0,
"_source":{"fubar": 1, "name": "Alice"},
"sort" : [ 1.0, 1.0 ]
}, {
"_index" : "test",
"_type" : "test",
"_id" : "6",
"_score" : 1.0,
"_source":{"fubar": 10, "name": "Fred"},
"sort" : [ 1.0, 1.0 ]
}, {
"_index" : "test",
"_type" : "test",
"_id" : "4",
"_score" : 1.0,
"_source":{"fubar": 17, "name": "David"},
"sort" : [ 0.0, 1.0 ]
}, {
"_index" : "test",
"_type" : "test",
"_id" : "5",
"_score" : 1.0,
"_source":{"fubar": 5, "name": "Evelyn"},
"sort" : [ 0.0, 1.0 ]
}, {
"_index" : "test",
"_type" : "test",
"_id" : "2",
"_score" : 1.0,
"_source":{"fubar": 21, "name": "Bob"},
"sort" : [ 0.0, 1.0 ]
}, {
"_index" : "test",
"_type" : "test",
"_id" : "3",
"_score" : 1.0,
"_source":{"fubar": 33, "name": "Carol"},
"sort" : [ 0.0, 1.0 ]
} ]

注意,首先返回爱丽丝和弗雷德,这是所需的行为。对于我的琐碎情况,所有文档的得分均为1.0,因此使用 _score作为第二排序标准无效,但是将考虑实际数据(具有实际评分)。

关于elasticsearch - 避免ElasticSearch查询中的魔术数增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28333634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com