我正在尝试根据通过Elasticsearch存储在数组中的某些值对文档进行评分。例如,如果我的文档包含这样的数组对象:
文档1:
{
id: "test",
marks: [{
"classtype" : "x1",
"value": 90
}]
}
文档2:
{
id: "test2",
marks: [{
"classtype" : "x1",
"value": 50
},{
"classtype" : "x2",
"value": 60
}]
}
我希望通过基于“ classtype”选择提升因子来提升我的输出分数,但适用于“ value”。 等效代码为:
var boostingfactor = {
"x1" : 1,
"x2" : 10
}
var smartscore = 0;
marks.forEach(function(mark){
return smartscore += mark.value * boostingfactor[mark.classtype];
});
return smartscore;
我已经尝试过对整数值进行elasticsearch查询,但是不确定是否可以对数组中存在的值进行相同的查询。我也尝试过使用Elasticsearch的{{1}}语言编写脚本,但是找不到正确的方法来基于painless
过滤值。
classtype
预期结果是示例文档1得分为90(90 * 1),文档2得分为650(50 * 1 + 60 * 10),但以上查询失败,但出现以下异常:
POST /student/_search
{
"query": {
"function_score": {
"script_score" : {
"script" : {
"params": {
"x1": 1,
"x2": 10
},
"source": "params[doc['marks.classtype']] * marks.value"
}
}
}
}
}
是否可以通过修改脚本来完成结果?
Elasticsearch版本:7.1.0
答案 0 :(得分:0)
我能够使用以下脚本读取数组值:
"script_score" : {
"script" : {
"params": {
"x1": 5,
"x2": 10
},
"source": "double sum = 0.0; for (item in params._source.marks) { sum += item.value * params[item.classtype]; } return sum;"
}
}