首页 > 解决方案 > 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"
      }

是否可以通过修改脚本来完成结果?

弹性搜索版本:7.1.0

标签: elasticsearch

解决方案


我能够使用以下脚本读取数组值:

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

推荐阅读