Kibana中查询两个geo_bounding_box数据集共有的username实现方案
结论
你描述的需求完全可以在Kibana中实现,你提到的地图框选区域生成数据集的操作可以直接作为筛选条件,配合聚合规则即可得到目标结果,具体操作如下:
方法1:可视化界面操作(无需写查询语句)
- 新建Lens数据表可视化,数据源选择你的
request索引 - 添加两个geo_bounding_box过滤器,逻辑关系设为「或(OR)」:
- 过滤器1:字段选
location,运算符选「是在边界框内」,设置第一个区域的经纬度范围,命名为区域A - 过滤器2:字段选
location,运算符选「是在边界框内」,设置第二个区域的经纬度范围,命名为区域B
如果你习惯用地图操作,也可以直接在Kibana地图组件中分别框选两个区域生成对应过滤器,和上述配置效果一致
- 过滤器1:字段选
- 配置聚合规则:
- 行维度选择
username.keyword字段,用来按用户名精确值分组 - 新增两个「唯一计数」指标:
- 第一个指标筛选条件限定为区域A,统计字段选
id,命名为「区域A出现次数」 - 第二个指标筛选条件限定为区域B,统计字段选
id,命名为「区域B出现次数」
- 第一个指标筛选条件限定为区域A,统计字段选
- 行维度选择
- 最后添加筛选条件,保留「区域A出现次数≥1」且「区域B出现次数≥1」的分组,剩余的列表就是同时在两个数据集中出现过的用户名。
方法2:Dev Tools直接运行DSL查询
如果需要直接获取原始查询结果,可以在Kibana Dev Tools中执行如下DSL:
GET /request/_search { "size": 0, "query": { "bool": { "should": [ { "geo_bounding_box": { "location": { "top_left": { "lat": 第一个区域左上角纬度, "lon": 第一个区域左上角经度 }, "bottom_right": { "lat": 第一个区域右下角纬度, "lon": 第一个区域右下角经度 } } } }, { "geo_bounding_box": { "location": { "top_left": { "lat": 第二个区域左上角纬度, "lon": 第二个区域左上角经度 }, "bottom_right": { "lat": 第二个区域右下角纬度, "lon": 第二个区域右下角经度 } } } } ], "minimum_should_match": 1 } }, "aggs": { "all_users": { "terms": { "field": "username.keyword", "size": 10000 }, "aggs": { "count_area_a": { "filter": { "geo_bounding_box": { "location": { "top_left": { "lat": 第一个区域左上角纬度, "lon": 第一个区域左上角经度 }, "bottom_right": { "lat": 第一个区域右下角纬度, "lon": 第一个区域右下角经度 } } } } }, "count_area_b": { "filter": { "geo_bounding_box": { "location": { "top_left": { "lat": 第二个区域左上角纬度, "lon": 第二个区域左上角经度 }, "bottom_right": { "lat": 第二个区域右下角纬度, "lon": 第二个区域右下角经度 } } } } }, "exists_in_both": { "bucket_selector": { "buckets_path": { "a": "count_area_a._count", "b": "count_area_b._count" }, "script": "params.a >= 1 && params.b >=1" } } } } } }
查询结果的aggregations.all_users.buckets列表中就是同时在两个区域出现过的用户名。
内容的提问来源于stack exchange,提问作者Leo B
相关产品推荐
相关产品推荐

