成绩结果修正
Correction of score results
我想知道是否可以在 elastic 中实现它。假设我有这种结构的文档。
{
"title": "text1 text2 text3",
"score_adj":[
{"text":"text1", "adj": -2},
{"text":"text3", "adj": -4}
]
}
我会查找 title
包含单词 text1
的文档,我会找到这个文档,而且,因为这个单词在 score_adj
中并且它有 -2
,我会把最终分数减去这个数字。是否可以实现这样的逻辑?我知道有script_score
可以让你改变分数,但我不明白你怎么能重复这种情况。
这是一种可能性:
{
"query": {
"bool": {
"must": [
{
"function_score": {
"query": {
"match": {
"title": "text1"
}
},
"functions": [
{
"script_score": {
"script": {
"source": """
def found = params._source['score_adj'].find(item -> item.text==params.text);
if (found != null) {
// adj is always negative so use plus
return _score + found.adj
}
return _score;
""",
"params": {
"text": "text1"
}
}
}
}
],
"boost_mode": "replace"
}
}
]
}
}
}
但可能会导致错误
script score function must not produce negative scores, but got
[-1.7123179137706757]
所以你必须考虑到这一点。也许首先将原始 _score
乘以 10 或其他东西,这样你就可以保证不会变成负值。
我认为将 adj
转换为百分比更合理,而不是具体值...
我想知道是否可以在 elastic 中实现它。假设我有这种结构的文档。
{
"title": "text1 text2 text3",
"score_adj":[
{"text":"text1", "adj": -2},
{"text":"text3", "adj": -4}
]
}
我会查找 title
包含单词 text1
的文档,我会找到这个文档,而且,因为这个单词在 score_adj
中并且它有 -2
,我会把最终分数减去这个数字。是否可以实现这样的逻辑?我知道有script_score
可以让你改变分数,但我不明白你怎么能重复这种情况。
这是一种可能性:
{
"query": {
"bool": {
"must": [
{
"function_score": {
"query": {
"match": {
"title": "text1"
}
},
"functions": [
{
"script_score": {
"script": {
"source": """
def found = params._source['score_adj'].find(item -> item.text==params.text);
if (found != null) {
// adj is always negative so use plus
return _score + found.adj
}
return _score;
""",
"params": {
"text": "text1"
}
}
}
}
],
"boost_mode": "replace"
}
}
]
}
}
}
但可能会导致错误
script score function must not produce negative scores, but got [-1.7123179137706757]
所以你必须考虑到这一点。也许首先将原始 _score
乘以 10 或其他东西,这样你就可以保证不会变成负值。
我认为将 adj
转换为百分比更合理,而不是具体值...