Elasticsearch如何查询累计去重登录用户数及账号搜索用户数
问题原因排查
- 索引路径错误:你发起的请求路径
GET /Logstach/_Search_Tracking/_count不符合Elasticsearch请求规范,同时你给出的实际业务索引名为ABC,和请求里的Logstach完全不匹配。ES7及以上版本默认单类型_doc,不需要在请求路径里额外指定类型,正确的计数请求基础路径为GET /ABC/_count。 - 查询字段规则错误:你写的查询条件
q=user:userId是匹配user字段值为userId字符串的文档,但实际上userId是user对象下的嵌套子字段,正确的字段路径为user.userId;同时你用到的AccountId和实际索引结构里的小写开头accountId不匹配,ES字段名大小写敏感,自然会匹配不到数据返回0结果。 - 统计逻辑错误:
_count接口只能统计匹配条件的文档总数量,无法实现你需要的「去重统计」需求,要实现去重计数需要使用cardinality聚合能力。
正确实现方案
1. 按User ID统计累计去重登录用户总数
GET /ABC/_search { "size": 0, "aggs": { "distinct_user_total": { "cardinality": { "field": "user.userId.keyword", "precision_threshold": 10000 } } } }
说明:如果你的user.userId字段本身就是keyword类型,可以去掉路径里的.keyword后缀;precision_threshold参数用于调整统计精度,基数小于等于该参数值时统计误差接近0,最大支持设置为40000
2. 按Account ID统计累计去重账号搜索用户总数
GET /ABC/_search { "size": 0, "aggs": { "distinct_account_total": { "cardinality": { "field": "user.accountId.keyword", "precision_threshold": 10000 } } } }
如果你只是需要统计所有包含对应字段的文档总数(不需要去重),可以直接用简化的count请求:
// 统计所有有userId的文档总数 GET /ABC/_count?q=exists:user.userId // 统计所有有accountId的文档总数 GET /ABC/_count?q=exists:user.accountId
内容的提问来源于stack exchange,提问作者Prabhudas8703
相关产品推荐
相关产品推荐

