script_score
在 OpenSearch 中,我使用 Painless 脚本语言实现了自定义。当我只使用query.bool.should
它时,每个文档都会调用一次,并且返回的结果_score
是正确的
但是,当我在查询中结合使用query.bool.should
和时,每个文档会调用两次或三次,而最终得分是所有调用的总和。这会导致得分高于预期。query.bool.must
script_score
should
为什么会发生这种情况?当同时使用和must
时,如何确保每个文档仅调用一次query
?或者至少阻止 OpenSearch 对每个文档的所有调用结果求和,并仅返回其中一个调用的结果?
例如,参见下面的查询(我在这里简化了它,以便示例易于理解),您会看到来源script_source
是,return Integer.parseInt(doc['_id'].value);
但是因为我使用了两者should
,并且在我的查询中,文档的must
计算是(即)而不是_score
6148
18444
6148 * 3
6148
{
"from": 0,
"size": 10,
"stored_fields": "_none_",
"docvalue_fields": [
"_id",
"_score"
],
"sort": [
{
"_score": {
"order": "asc"
}
}
],
"query": {
"function_score": {
"query": {
"bool": {
"must": [
{
"term": { "category_ids": "2" }
},
{
"terms": { "visibility": ["3", "4"] }
}
],
"should": [
{
"ids": {
"values": [
"6148"
]
}
}
],
"minimum_should_match": 1
}
},
"script_score": {
"script": {
"lang": "painless",
"source": "return Integer.parseInt(doc['_id'].value);"
}
}
}
}
}
回答我自己的问题是为了帮助将来可能遇到同样问题的人。虽然我仍然不明白为什么在某些情况下会多次调用
script_score
,但我能够修复得分。为了防止得分被相加或相乘,我添加了
boost_mode: replace
如下参数:我通过查看 OpenSearch 文档https://opensearch.org/docs/latest/query-dsl/compound/function-score找到了此解决方案
[1] 请注意,
boost_mode
在两种情况下都有效:无论您有一个函数(如我的情况)还是多个函数(在有多个函数的情况下,您可能也希望score_mode
从我上面提供其链接的同一文档页面中查看参数)