如何在OpenSearch中按company_id分组统计并返回company_name
在OpenSearch中按company_id分组并返回company_name和统计数
要在按company_id分组统计文档数量的同时返回对应的company_name,可以通过在terms聚合下添加子聚合实现。由于同一company_id对应的company_name通常是唯一的,推荐使用top_hits子聚合获取每个分组的company_name,具体查询语句如下:
GET test1/_search { "size": 0, "aggs": { "group_by_company": { "terms": { "field": "identity.company.company_id", "size": 100 }, "aggs": { "company_detail": { "top_hits": { "size": 1, "_source": { "includes": ["identity.company.company_name"] } } } } } } }
关键逻辑说明
- 外层
terms聚合:按company_id分组,返回的doc_count字段即为该分组的文档统计数 - 内层
top_hits聚合:仅返回每个分组内的第一个文档的company_name字段(因同一company_id下company_name一致,取单个结果即可)
示例返回结果
{ "aggregations": { "group_by_company": { "buckets": [ { "key": 1, "doc_count": 2, "company_detail": { "hits": { "hits": [ { "_source": { "identity": { "company": { "company_name": "Test Company 1" } } } } ] } } }, { "key": 2, "doc_count": 1, "company_detail": { "hits": { "hits": [ { "_source": { "identity": { "company": { "company_name": "Test Company 2" } } } } ] } } }, { "key": 3, "doc_count": 1, "company_detail": { "hits": { "hits": [ { "_source": { "identity": { "company": { "company_name": "Test Company 3" } } } } ] } } } ] } } }
备选方案(若company_name为keyword类型)
如果company_name字段已映射为keyword类型,且能确保company_id与company_name严格一一对应,也可以用脚本拼接字段作为分组key:
GET test1/_search { "size": 0, "aggs": { "group_by_company": { "terms": { "script": "doc['identity.company.company_id'].value + '|' + doc['identity.company.company_name'].value", "size": 100 } } } }
这种方式需要自行拆分结果中的key来获取两个字段的值,相比top_hits方式不够直观,推荐优先使用第一种方案。
内容的提问来源于stack exchange,提问作者Thrillho
相关产品推荐
相关产品推荐

