基于单个字段的Term Aggregation,如何输出多个关联字段?
解决方案
你的需求是按FIELD1分组,同时获取分组计数、FIELD2和FIELD3的值,对应SQL的SELECT COUNT(FIELD1), FIELD2, FIELD3 FROM TABLE GROUP BY FIELD1。当前方案的问题及优化方式如下:
问题分析
- top_hits默认仅返回1条数据:top_hits聚合默认
size=1,只会返回分组内第一条文档的FIELD2/3值,若分组内存在多个不同的FIELD2/3值,会遗漏其他结果。 - 聚合命名重复:父聚合和子聚合均使用
agg_name,虽不影响功能,但可读性差,建议区分命名。 - 未设置查询
size=0:若未指定size:0,查询会返回部分原始文档,可能干扰聚合结果的查看。
优化方案
根据业务场景选择对应方案:
场景1:同一FIELD1分组内的FIELD2、FIELD3为唯一值
如果每个FIELD1对应的FIELD2、FIELD3固定不变(比如FIELD1是用户ID,FIELD2是用户名,FIELD3是用户邮箱),用min/max聚合直接获取字段值,性能比top_hits更优:
{ "size": 0, "aggs": { "group_by_field1": { "terms": { "field": "FIELD1", "order": { "_count": "desc" } }, "aggs": { "field2": { "min": { "field": "FIELD2" } }, "field3": { "min": { "field": "FIELD3" } } } } } }
返回结果中,每个bucket的doc_count就是分组的计数(对应SQL的COUNT(FIELD1)),field2和field3为对应字段的唯一值。
场景2:同一FIELD1分组内的FIELD2、FIELD3存在多个不同值
若需要保留分组内所有FIELD2/3的组合,调整top_hits的size参数至足够覆盖分组内的文档数量,同时区分聚合命名:
{ "size": 0, "aggs": { "group_by_field1": { "terms": { "field": "FIELD1", "order": { "_count": "desc" } }, "aggs": { "related_docs": { "top_hits": { "size": 100, // 根据实际分组内文档数调整 "_source": { "includes": ["FIELD2", "FIELD3"] } } } } } } }
返回结果中,每个bucket的doc_count是分组计数,related_docs.hits.hits会包含分组内指定数量文档的FIELD2/3值。
内容的提问来源于stack exchange,提问作者Bindu
相关产品推荐
相关产品推荐

