如何统计各版本客户数?仅统计客户使用的最高版本
解决Elasticsearch中按客户最高版本统计客户数的问题
你当前的聚合查询会将同时使用多个版本的客户重复计入对应版本的统计,要实现每个客户仅归属其使用的最高版本,需要结合嵌套聚合和管道聚合来完成,以下是完整的实现方案:
完整查询语句
{ "size": 0, "aggs": { "group_by_org": { "terms": { "field": "orgId.keyword", "size": 10000 // 根据实际客户数量调整size,确保覆盖所有客户 }, "aggs": { "top_version": { "top_hits": { "sort": [ { "version.major": { "order": "desc" } }, { "version.minor": { "order": "desc" } } ], "_source": ["version.string.keyword"], "size": 1 } } } }, "version_customer_count": { "terms": { "field": "top_version.hits.hits._source.version.string.keyword", "order": { "_key": "desc" }, "size": 50 } } } }
逻辑说明
- 第一层聚合
group_by_org:按orgId.keyword分组,确保每个客户的数据被单独处理,size需设置为足够大的值以覆盖所有客户。 - 子聚合
top_version:通过top_hits聚合,按version.major和version.minor降序排序,取每个客户的第一条数据,即该客户使用的最高版本。 - 管道聚合
version_customer_count:基于前面每个客户的最高版本字段,再次按version.string.keyword分组统计,得到每个版本对应的唯一客户数。
预期结果
执行上述查询后,返回的聚合结果会符合你的预期:每个客户仅被计入其最高版本的统计中,最终结果类似:
{ "aggregations": { "group_by_org": { ... }, "version_customer_count": { "buckets": [ { "key": "1.2", "doc_count": 1 }, { "key": "1.1", "doc_count": 1 } ] } } }
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

