在ElasticSearch中创建「品牌爱好者」用户分群
ElasticSearch统计「品牌爱好者」数量实现方案
核心思路
通过日期范围过滤筛选过去x天的访问数据,再按唯一token分组统计访问次数,最后过滤出访问次数≥15的token并统计其数量。
具体DSL查询
将以下代码中的your_index_name替换为你的索引名,{{x_days}}替换为具体天数(如7代表过去7天):
POST /your_index_name/_search { "size": 0, // 不需要返回原始文档,只取聚合结果 "query": { "range": { "time": { "gte": "now-{{x_days}}d", "lt": "now" } } }, "aggs": { // 第一步:按token分组,统计每个token的访问次数 "token_visit_stats": { "terms": { "field": "token.keyword", // 若token是text类型必须加.keyword,keyword类型直接用token "size": 10000 // 根据实际token数量调整,确保覆盖所有符合条件的token }, "aggs": { // 第二步:过滤出访问次数≥15的token分组 "filter_brand_lovers": { "bucket_selector": { "buckets_path": { "visitCount": "_count" }, "script": "params.visitCount >= 15" } } } }, // 第三步:统计符合条件的token总数 "brand_lover_total": { "stats_bucket": { "buckets_path": "token_visit_stats._count" } } } }
结果解读
返回结果中,aggregations.brand_lover_total.count的值就是你需要的「品牌爱好者」数量(访问次数≥15的唯一token数)。
注意事项
- 如果
token字段是text类型,必须使用token.keyword进行聚合,否则会因分词导致分组错误。 terms聚合的size参数需根据实际token规模调整,若token数量极大(百万级以上),建议改用composite聚合实现分页统计,避免内存溢出。- 若你的ES版本不支持
bucket_selector,可以先用terms聚合获取所有token的访问次数,再在客户端过滤统计符合条件的数量,但效率低于服务端过滤。
内容的提问来源于stack exchange,提问作者Jason Norwood-Young
相关产品推荐
相关产品推荐

