我正在尝试使用script_score根据ID值的json更新分数。分数应将原始分数乘以params中列出的因子。
"script_score": {
"params": {
"ranking": {
"1": "1.3403946161270142",
"3": "1.3438195884227753"
}
},
"script": "_score * ranking[doc['ID'].value]"
}
我收到以下错误:
nested: QueryParsingException[[index name] script_score the script could not be loaded]; nested: CompileException[[Error: unbalanced braces [ ... ]]\n[Near : {... _score * ranking[doc['ID'].value] ....}]\n ^\n[Line: 1, Column: 29]]; }]"
如果我手动指定例如_score * ranking ['1']的ID,它可以正常工作。此外,如果我直接使用ID它可以工作,但如果我使用ID值作为索引则不行。我应该注意ID是一个整数。谁能帮我解决这个问题?此外,如果ID不在排名列表中,这将如何工作?它会把它当作得分='_得分'吗?
答案 0 :(得分:1)
你ranking
param不是数组而是地图。用于ID
字段的类型应与地图中用于键的类型匹配,并且提升应该是数字,而不是字符串。
这是一份文件:
{
"ID" : "1"
}
这是更新的查询:
GET / test / _search
{
"query": {
"function_score": {
"functions": [
{
"script_score": {
"params": {
"ranking": {
"1": 1.3403946161270142,
"3": 1.3438195884227753
}
},
"script": "_score * ranking.get(_doc['ID'].value)"
}
}
]
}
}
}
当前脚本不处理条目不在parama映射内的情况,导致NullPointerException
的情况。
那就是说我认为这种提升方法不会扩展,因为你需要在你的参数中找到每个文档的一个条目,这是难以维护的。在每个文档中排名似乎更好,尽管每次要更改它时都需要更新它们。