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
相关产品推荐
相关产品推荐

