Elasticsearch多索引聚合:过滤指定Person时返回归档及对应文档
解决Elasticsearch聚合中返回归档及对应文档的需求
嗨,我明白你的需求了——现在你能按所有者聚合归档,但还想在每个归档分组里直接看到对应的文档,对吧?咱们可以通过在现有聚合基础上嵌套top_hits聚合来实现这个目标。
先看一下修改后的查询代码,我会逐段解释:
{ "post_filter": { "terms": { "owner": ["my_owner_id"] } }, "aggs": { "_filter_archive": { "filter": { "terms": { "owner": ["my_owner_id"] } }, "aggs": { "archive": { "terms": { "field": "archive" }, "aggs": { "related_documents": { "top_hits": { "size": 10, // 调整为你需要返回的单归档文档数量,设为1000(或更大)可返回所有匹配文档 "_source": ["title", "content", "create_time"], // 可选:指定要返回的文档字段,不写则返回全部字段 "sort": [{ "create_time": "desc" }] // 可选:按字段排序,比如最新文档在前 } } } } } } } }
关键修改点说明:
- 嵌套top_hits聚合:在
archive的terms聚合下,新增了related_documents的top_hits聚合,它会帮你取出每个归档分组下匹配的文档。 - size参数:控制每个归档返回的文档数量,如果需要获取该归档下所有文档,可以把size设为足够大的值(注意Elasticsearch默认有
index.max_result_window限制,默认是10000,若需要超过这个数可能需要调整配置或用scroll查询)。 - _source筛选:可以指定只返回你关心的字段,减少数据传输量。
- sort排序:可选配置,让返回的文档按你需要的顺序排列。
额外提醒:
确保你的archive字段是keyword类型(或其他适合聚合的类型),否则terms聚合可能无法正确分组。另外,如果你是通过跨索引关联数据(而非在Document索引中冗余owner字段),可能需要结合has_parent查询来关联Archive的owner信息,但从你当前的代码来看,应该已经做了字段冗余,这样的查询效率会更高。
这样执行查询后,你就能在每个归档的bucket里看到对应的文档列表啦!
内容的提问来源于stack exchange,提问作者Oskar Persson
相关产品推荐
相关产品推荐

