elasticsearch - ElasticSearch:是否可以按分数加权进行“加权平均聚合”?
问题描述
我正在尝试对价格字段 ( ) 执行平均price.avg
。但我希望查询的最佳匹配对平均值的影响比最新的影响更大,因此平均值应由计算的分数字段加权。这是我正在实施的聚合。
{
"query": {...},
"size": 100,
"aggs": {
"weighted_avg_price": {
"weighted_avg": {
"value": {
"field": "price.avg"
},
"weight": {
"script": "_score"
}
}
}
}
}
它应该给我我想要的。但相反,我收到一个空值:
{...
"hits": {...},
"aggregations": {
"weighted_avg_price": {
"value": null
}
}
}
有什么我想念的吗?这个聚合查询可行吗?有什么解决方法吗?
解决方案
当您调试内部可用的内容时script
GET prices/_search
{
"size": 0,
"aggs": {
"weighted_avg_price": {
"weighted_avg": {
"value": {
"field": "price"
},
"weight": {
"script": "Debug.explain(new ArrayList(params.keySet()))"
}
}
}
}
}
以下内容被吐出
[doc, _source, _doc, _fields]
这些都不包含有关_score
您尝试访问的查询的信息,因为聚合在与查询级别评分不同的上下文中运行。这意味着该weight
值需要
- 存在于文档中或
- 存在于文档中 + 可修改或
- 是查询时间常数(如
42
or0.1
)
一种解决方法可能是将数学函数应用于检索到的,price
例如
"script": "Math.pow(doc.price.value, 0.5)"
推荐阅读
- c# - 我创建了一个包含列表的表单,我正在尝试以新表单访问该列表
- excel - 出现运行时错误“13”:运行以下宏时类型不匹配
- python - 在烧瓶 API 中的烧瓶休息端点之间进行调用的正确方法是什么?
- sql - 循环遍历表并删除行时出错
- python - 如何基于索引python创建值列表
- sql - 对于具有某些相同字段的多行,保留具有更新值的行,并标记其他行
- excel - 从文件中找到字符串后提取某些行
- reactjs - 同时使用 Fuse js 过滤多个列表
- javascript - 检查时间是否在特定时间范围内
- json - 链接器无法从 json-glib 中找到“get_int_member_with_default”