Elasticsearch查询:如何筛选有eventName=mko无mkp的用户ID
Elasticsearch 多事件关联用户筛选方案
以下是满足需求的最优查询实现,单次查询即可直接返回符合条件的userId:
GET /你的索引名称/_search { "size": 0, "query": { "terms": { "eventName.keyword": ["mko", "mkp"] } }, "aggs": { "valid_user_groups": { "terms": { "field": "userId.keyword", "size": 10000 }, "aggs": { "user_event_types": { "terms": { "field": "eventName.keyword", "size": 2 } }, "filter_target_user": { "bucket_selector": { "buckets_path": { "total_event_types": "user_event_types._bucket_count", "has_mko_event": "user_event_types['mko']._count" }, "script": "params.total_event_types == 1 && params.has_mko_event != null" } } } } } }
说明
- 执行逻辑:
- 首先通过query过滤仅保留
eventName为mko或mkp的文档,缩小后续计算范围 - 按
userId做分组聚合,统计每个用户对应的事件类型 - 用管道过滤器筛选出仅有一种事件类型、且该类型为
mko的用户分组,自然排除了存在mkp事件的用户
- 首先通过query过滤仅保留
- 适配调整:
- 若你的
eventName、userId字段本身就是keyword类型,去掉查询语句中的.keyword后缀即可 - 若需要返回的符合条件的用户数超过10000,可调整
terms聚合的size参数,或改用composite聚合实现滚动分页查询
- 若你的
- 性能优势:无需多次查询后在内存中做集合对比,单请求即可得到结果,是该场景下的最优实现方式
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

