Elasticsearch提高数组中值的得分

时间:2019-08-08 18:37:13

标签: elasticsearch

我正在尝试根据通过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

1 个答案:

答案 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;"
                }
            }