如何在Elasticsearch中获取每个唯一name对应的最新文档?
如何在Elasticsearch中一次请求获取每个唯一name对应的最新日期文档的rank或完整文档?
你当前的聚合只能拿到每个name对应的最新日期,但没法关联到对应的rank值或完整文档。要实现这个需求,有两种常用方式:
方法一:使用top_hits聚合
这是聚合场景下最直接的解决方案,在按name分组的子聚合中,用top_hits取出每个组内日期最新的文档:
{ "size": 0, // 无需返回原始搜索结果,仅关注聚合输出 "aggs": { "group-by-name": { "terms": { "field": "name" }, "aggs": { "latest-document": { "top_hits": { "size": 1, // 每个分组只取1条最新文档 "sort": [ { "date": { "order": "desc" // 按日期倒序,确保最新的排在最前 } } ], "_source": ["rank", "date", "name"] // 可选:指定要返回的字段,省略则返回完整文档 } } } } } }
执行后,每个name分组下的latest-document会包含该name对应的最新日期文档,你可以从中直接获取rank值或完整文档内容。
方法二:使用collapse折叠功能
如果不需要额外的聚合统计,只是想获取每个name的最新文档,也可以用collapse在搜索结果层面实现折叠:
{ "query": { "match_all": {} // 可替换为你的实际查询条件 }, "collapse": { "field": "name", // 按name字段折叠 "inner_hits": { "name": "latest", "size": 1, "sort": [{"date": {"order": "desc"}}] // 取每个折叠组内日期最新的文档 } }, "size": 0 // 无需返回根级别文档,仅查看inner_hits内容 }
这种方式更轻量化,适合仅需获取最新文档、不需要聚合其他指标的场景。
内容的提问来源于stack exchange,提问作者Aurelien
相关产品推荐
相关产品推荐

