如何在AWS ElasticSearch 6.0中查找并统计重复用户ID
嘿,我来帮你搞定AWS Elasticsearch 6.0里统计用户ID重复次数的问题~ 之前用可视化工具导出结果和SQL数据源不符,大概率是因为可视化工具默认限制了聚合返回的数量或者做了抽样,直接用ES的聚合API查询会更准确。
下面是一步步的解决方案,都是适合非Lucene进阶用户的简单操作:
1. 用ES聚合API获取用户ID频次数据
ES的terms聚合就是专门用来统计字段值出现次数的,直接发送以下请求就能拿到全量的用户ID计数(记得替换成你的ES集群端点):
curl -X GET "https://your-es-cluster-endpoint/_search" -H "Content-Type: application/json" -d' { "size": 0, # 不返回具体文档,只拿聚合结果,节省资源 "aggs": { "user_id_counts": { "terms": { "field": "user_id", # 替换成你存储用户ID的字段名 "size": 10000 # 这里设大点,确保覆盖所有用户ID,默认只返回前10个! } } } }'
注意:如果你的
user_id字段是text类型(ES 6.0默认会把字符串设为text),需要改成user_id.keyword来聚合,因为text字段不能直接做terms聚合。
2. 把JSON结果转成你要的格式
上面的请求返回的是JSON结构,用jq工具可以快速转成你需要的USER ID COUNT格式:
curl -X GET "https://your-es-cluster-endpoint/_search" -H "Content-Type: application/json" -d' { "size": 0, "aggs": { "user_id_counts": { "terms": { "field": "user_id", "size": 10000 } } } }' | jq -r '"USER ID\tCOUNT", .aggregations.user_id_counts.buckets[] | "\(.key)\t\(.doc_count)"'
执行后你会得到类似这样的输出:
USER ID COUNT userid1 4 userid22 3 userid5 1 ...
3. 如果用户ID数量极大怎么办?
如果你的用户ID超过了size的上限(ES 6.0默认max_terms_count是65536),可以用composite聚合来分页获取所有结果,示例:
第一次请求:
curl -X GET "https://your-es-cluster-endpoint/_search" -H "Content-Type: application/json" -d' { "size": 0, "aggs": { "user_id_counts": { "composite": { "sources": [ { "user_id": { "terms": { "field": "user_id" } } } ] } } } }'
拿到结果后,会有一个after_key字段,下次请求带上它就能获取下一批数据:
curl -X GET "https://your-es-cluster-endpoint/_search" -H "Content-Type: application/json" -d' { "size": 0, "aggs": { "user_id_counts": { "composite": { "sources": [ { "user_id": { "terms": { "field": "user_id" } } } ], "after": {"user_id": "last_user_id_from_previous_result"} } } } }'
为什么之前可视化导出不准?
大部分可视化工具(比如Kibana)默认会限制聚合结果的展示数量(比如只显示前50个高频用户),或者在数据量大时做了抽样,导致统计不全。直接用API查询并设置足够大的size(或用composite分页)能拿到完整的统计结果,和SQL数据源对齐。
内容的提问来源于stack exchange,提问作者user1469297
相关产品推荐
相关产品推荐

