如何在ElasticSearch中按documentId分组列出对应serviceName值?
ElasticSearch实现按documentId分组汇总serviceName
当然可以实现这个需求,你可以通过ElasticSearch的聚合功能来完成,核心思路是按documentId字段分组,再收集每个分组下对应的serviceName值。下面提供两种常用的实现方式:
方式一:嵌套Terms聚合(自动去重serviceName)
这种方式会自动对每个documentId下的serviceName去重,适合不需要保留重复值的场景:
POST /你的索引名/_search { "size": 0, // 不返回原始文档,只返回聚合结果 "aggs": { "按documentId分组": { "terms": { "field": "documentId", "size": 1000 // 调整为你需要的最大分组数量 }, "aggs": { "收集serviceName": { "terms": { "field": "serviceName", "size": 1000 // 调整为每个分组下最多收集的serviceName数量 } } } } } }
方式二:Top Hits聚合(保留所有匹配的serviceName)
如果需要保留每个documentId下所有的serviceName(包括重复值,若存在),可以用Top Hits聚合:
POST /你的索引名/_search { "size": 0, "aggs": { "按documentId分组": { "terms": { "field": "documentId", "size": 1000 }, "aggs": { "收集serviceName": { "top_hits": { "size": 1000, "_source": { "includes": ["serviceName"] // 只返回serviceName字段 } } } } } } }
结果处理
执行上述查询后,ElasticSearch会返回包含各documentId分组的聚合结果,你可以从每个分组的buckets中提取对应的serviceName值,整理成你需要的1: 2020, 2019这种格式。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

