You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:24:00