elasticsearch - 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
解决方案
我能够使用以下脚本读取数组值:
"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;"
}
}
推荐阅读
- python - 转置数据框熊猫后将结构保留为普通数据框
- html - 在反应引导工具提示中添加 HTML 标记
- tableau-api - Tableau 计算字段标题中的记录总数
- c# - 在实时代码编辑期间而不是在构建期间运行 Roslyn 分析器
- python - 是否可以在预训练模型上使用 StackRegressor?
- reactjs - 开玩笑地在窗口中测试一个类
- c# - 如何使用 Stylecop Analyzer 和自定义规则集创建 nuget 包?
- kubernetes - Pod 处于待处理阶段(错误:FailedScheduling:节点与节点选择器不匹配)
- swift - 中心 CAShapeLayer
- python - Django allauth 模块在登录时抛出错误?