如何在Kibana的KQL中查询同时有BUY_ITEM1和BUY_ITEM2的user_id?
查询同时存在BUY_ITEM1和BUY_ITEM2行为的user_id方法
现有日志数据
Elasticsearch中存储的日志样例如下:
{"@timestamp":"2022-07-19T11:24:16.274073+05:30","log":{"level":200,"logger":"production","message":"BUY_ITEM1","context":{"user_id":31312},"datetime":"2022-07-19T11:24:16.274073+05:30","extra":{"ip":"127.0.0.1"}}} {"@timestamp":"2022-07-19T11:24:16.274073+05:30","log":{"level":200,"logger":"production","message":"BUY_ITEM2","context":{"user_id":31312},"datetime":"2022-07-19T11:24:16.274073+05:30","extra":{"ip":"127.0.0.1"}}} {"@timestamp":"2022-07-19T11:24:16.274073+05:30","log":{"level":200,"logger":"production","message":"CLICK_ITEM3","context":{"user_id":31312},"datetime":"2022-07-19T11:24:16.274073+05:30","extra":{"ip":"127.0.0.1"}}}
关键说明
不能直接用log.message: "BUY_ITEM1" AND log.message: "BUY_ITEM2"查询,因为单条日志的log.message字段只能是其中一个值,必须通过聚合跨文档判断同一个user_id是否同时存在两种行为。
方法一:使用Kibana界面操作
- 在KQL输入框中过滤出包含目标行为的日志:
log.message: ("BUY_ITEM1" OR "BUY_ITEM2") - 进入Discover页面的「聚合」面板,添加按
context.user_id的分组聚合; - 为该分组添加两个子聚合:
- 第一个子聚合选择「过滤」,过滤条件为
log.message: "BUY_ITEM1"; - 第二个子聚合选择「过滤」,过滤条件为
log.message: "BUY_ITEM2";
- 第一个子聚合选择「过滤」,过滤条件为
- 筛选出两个子聚合计数均大于0的
user_id,即为同时有两种购买行为的用户。
方法二:使用Elasticsearch DSL查询(Kibana Dev Tools中执行)
通过聚合+桶筛选直接得到符合条件的user_id:
{ "size": 0, "query": { "bool": { "should": [ {"term": {"log.message": "BUY_ITEM1"}}, {"term": {"log.message": "BUY_ITEM2"}} ], "minimum_should_match": 1 } }, "aggs": { "group_by_user": { "terms": { "field": "context.user_id", "size": 1000 }, "aggs": { "has_buy1": { "filter": {"term": {"log.message": "BUY_ITEM1"}} }, "has_buy2": { "filter": {"term": {"log.message": "BUY_ITEM2"}} }, "has_both": { "bucket_selector": { "buckets_path": { "buy1Count": "has_buy1._count", "buy2Count": "has_buy2._count" }, "script": "params.buy1Count > 0 && params.buy2Count > 0" } } } } } }
执行后,aggregations.group_by_user.buckets中的结果就是同时存在两种购买行为的user_id列表。
内容的提问来源于stack exchange,提问作者Aishwarya
相关产品推荐
相关产品推荐

