如何通过Elasticsearch聚合桶的key获取对应topic文档的_source?
单个Elasticsearch请求实现聚合结果关联获取topic文档内容
完全可以不用parent/child方案,通过嵌套聚合在单个请求里完成需求,具体实现如下:
实现思路
- 先对rate文档按
topicId做terms聚合,得到所有目标topic的ID - 在每个聚合桶内,嵌套
filter聚合筛选出对应ID的topic文档,再用top_hits聚合返回该topic的完整_source数据
请求代码示例
{ "size": 0, // 无需返回rate文档本身,仅保留聚合结果 "query": { "term": { "docType": "rate" // 仅针对rate文档执行聚合逻辑 } }, "aggs": { "topic_groups": { "terms": { "field": "topicId", // 按rate文档的topicId分组 "size": 1000 // 根据实际业务调整返回的桶数量上限 }, "aggs": { "match_topic_doc": { "filter": { "bool": { "must": [ {"term": {"docType": "topic"}}, {"term": {"id": "{{key}}"}} // 匹配当前桶对应的topicId ] } }, "aggs": { "topic_full_source": { "top_hits": { "size": 1, "_source": "*" // 返回topic文档的完整_source内容 } } } } } } } }
结果说明
- 外层
topic_groups聚合会返回每个topicId对应的聚合桶 - 每个桶内的
topic_full_source节点下,会包含对应topic文档的完整_source数据 - 若某个topicId无匹配的topic文档,该桶的
topic_full_source结果会为空
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

