真实用terms聚合按作者分组嵌套top_hits,精确取出每位作者浏览量最高的代表文章,并验证top_hits的排序范围覆盖完整的桶内文档集合而非被截断的子集。
代码真实索引: alice 3篇(浏览量100/500/200) / bob 2篇(浏览量300/50) POST /th_test/_search {"size":0,"aggs":{"by_author":{"terms":{"field":"author"},"aggs":{ "top_post":{"top_hits":{"size":1,"sort":[{"views":{"order":"desc"}}],"_source":["title","views"]}} }}}}
alice doc_count=3 -> {'title': 'alice post 2 (most viewed)', 'views': 500}
bob doc_count=2 -> {'title': 'bob post 1 (most viewed)', 'views': 300}这组真实结果验证了top_hits最核心的用法:它本质上是一个可以嵌套在任何bucket聚合内部的metric聚合,真实在每个桶对应的那部分文档子集里,按指定的sort条件重新排序并真实取出前size条完整文档——本次实测alice的3篇文章里浏览量最高的真实是500那篇,bob的2篇里真实是300那篇,top_hits精确把这两篇"代表作"挑了出来,而不是简单取每组遇到的第一条或者最后一条。
代码POST /th_test/_search {"size":0,"aggs":{"by_author":{"terms":{"field":"author"},"aggs":{ "top_post":{"top_hits":{"size":1,"sort":[{"views":{"order":"desc"}}]}} }}}}
alice: doc_count=3 top_hits.hits.total={'value': 3, 'relation': 'eq'} ← 真实完全一致
bob: doc_count=2 top_hits.hits.total={'value': 2, 'relation': 'eq'} ← 真实完全一致每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
top_hits 聚合与 terms 嵌套结构