Elasticsearch数组层级inner aggregation获取各Name+Type组合最新日期
Elasticsearch 按数组内对象组合分组取最新值解决方案
核心原因
你遇到的聚合结果错位问题,是因为Elasticsearch默认对普通对象数组采用扁平化存储,同一个数组内不同对象的同名字段会被合并为多值字段,丢失了单个对象内部的字段关联关系,所以跨字段组合聚合时无法正确匹配对应日期。
前置要求
需要先将database_backups字段的类型设置为nested,nested类型会将数组内的每个对象作为独立的隐式子文档存储,保留对象内部的字段关联。修改mapping的参考语句:
PUT /你的索引名/_mapping { "properties": { "database_backups": { "type": "nested", "properties": { "Date": { "type": "date", "format": "yyyy-MM-dd" }, "Name": { "type": "keyword" }, "Type": { "type": "keyword" } } } } }
注意:修改mapping后需要重新导入历史数据才能生效
正确聚合DSL
GET /你的索引名/_search { "size": 0, "aggs": { "backups_agg": { "nested": { "path": "database_backups" }, "aggs": { "name_type_group": { "composite": { "sources": [ { "name": { "terms": { "field": "database_backups.Name" } } }, { "type": { "terms": { "field": "database_backups.Type" } } } ] }, "aggs": { "latest_date": { "max": { "field": "database_backups.Date" } } } } } } } }
结果说明
返回的backups_agg.name_type_group.buckets数组中,每个bucket的key字段包含Name和Type值,latest_date.value_as_string即为对应组合的最新备份日期,和你期望的输出完全匹配:
- EventsSecurity + Diff:2021-09-01
- EventsAPI + Full:2021-09-03
- EventsAPI + Diff:2021-09-04
- EventsAPI + Log:2021-09-05
如果需要获取完整的备份对象信息,可以在latest_date同级添加top_hits聚合,设置size:1和按Date倒序排序即可。
内容的提问来源于stack exchange,提问作者Mikiku
相关产品推荐
相关产品推荐

