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

Elasticsearch 6.3.1如何基于两个字段组合实现collapse折叠查询

Elasticsearch 6.3.1 多字段组合取每组最新文档方案

Elasticsearch原生的collapse参数仅支持单字段折叠,要实现net_name + batch_size两个字段的组合分组取最新文档,推荐使用terms聚合+top_hits聚合的方案,无需修改现有索引结构,6.3.1版本完全兼容。

方案1:嵌套terms聚合(无需修改Mapping)

直接使用如下DSL查询即可:

POST 你的索引名/_search
{
  "size": 0, 
  "aggs": {
    "group_by_netname": {
      "terms": {
        "field": "header.net_name.keyword", 
        // 如果你的net_name字段本身就是keyword类型,去掉后缀.keyword即可
        "size": 1000 // 调整为你实际的net_name总数量上限
      },
      "aggs": {
        "group_by_batchsize": {
          "terms": {
            "field": "header.batch_size",
            "size": 100 // 调整为你实际的单个net_name下batch_size数量上限
          },
          "aggs": {
            "latest_doc": {
              "top_hits": {
                "size": 1,
                "sort": [
                  {
                    "header.date": {
                      "order": "desc" // 按日期倒序取最新1条
                    }
                  }
                ],
                "_source": ["header.net_name", "header.batch_size", "header.result"] // 只返回需要的字段
              }
            }
          }
        }
      }
    }
  }
}

返回结果中,每个group_by_batchsize的桶下的latest_doc.hits.hits[0]._source就是对应分组的最新文档,直接按预期格式导出即可。

方案2:使用collapse实现(需新增组合字段)

如果查询性能要求更高,可以在写入文档时新增一个keyword类型的组合字段,比如net_batch_key,值为${net_name}_${batch_size}(示例值为a_8、b_12),之后直接对该字段做collapse即可:

POST 你的索引名/_search
{
  "collapse": {
    "field": "net_batch_key"
  },
  "sort": [
    {"header.date": "desc"}
  ],
  "_source": ["header.net_name", "header.batch_size", "header.result"]
}

该方案查询效率更高,适合数据量较大的场景,但需要修改索引结构和写入逻辑。

注意事项

  • 确认用到的字段支持聚合:net_name需要为keyword类型,batch_size为数值类型,date为date类型
  • 聚合的size参数需要调整到覆盖所有分组数量,避免遗漏分组结果

内容的提问来源于stack exchange,提问作者Ido Sagiv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:06:01