【发布时间】:2019-08-09 03:58:00
【问题描述】:
我正在尝试根据通过 elasticsearch 存储在数组中的某些值对文档进行评分。例如,如果我的文档包含这样的数组对象:
文档 1:
{
id: "test",
marks: [{
"classtype" : "x1",
"value": 90
}]
}
文档 2:
{
id: "test2",
marks: [{
"classtype" : "x1",
"value": 50
},{
"classtype" : "x2",
"value": 60
}]
}
我希望通过基于“类类型”选择提升因子来提升我的输出分数,但适用于“价值”。 等效代码是:
var boostingfactor = {
"x1" : 1,
"x2" : 10
}
var smartscore = 0;
marks.forEach(function(mark){
return smartscore += mark.value * boostingfactor[mark.classtype];
});
return smartscore;
我尝试过对整数值进行弹性搜索查询,但不确定是否可以对数组中存在的值执行相同的操作。我还尝试使用 elasticsearch 的 painless 语言编写脚本,但找不到基于 classtype 过滤值的正确方法。
POST /student/_search
{
"query": {
"function_score": {
"script_score" : {
"script" : {
"params": {
"x1": 1,
"x2": 10
},
"source": "params[doc['marks.classtype']] * marks.value"
}
}
}
}
}
预期结果是样本文档 1 的得分为 90 (90*1),文档 2 的得分为 650 (50*1+60*10),但上述查询失败并出现异常:
{
"type": "script_exception",
"reason": "runtime error",
"script_stack": [
"params[doc['marks.classtype'].value]",
" ^---- HERE"
],
"script": "params[doc['marks.classtype'].value]",
"lang": "painless"
}
是否可以通过修改脚本来完成结果?
Elasticsearch 版本:7.1.0
【问题讨论】:
标签: elasticsearch