Elasticsearch二级嵌套聚合按城市过滤:统计班加罗尔各实验室测试量
Elasticsearch 按城市统计实验室测试数量问题
文档结构
{ "_index": "my_index", "_type": "_doc", "_id": "1296", "_version": 1, "_seq_no": 431, "_primary_term": 1, "_routing": "1296", "found": true, "_source": { "id": 1296, "test_name": "abc", "test_id": 513, "inventory_arr": [ { "city": "bangalore", "after_tat": 168, "before_tat": 54, "popularity_score": 15, "rank": 0, "discounted_price": 710, "labs": [ { "lab_id": 395, "lab_name": "Prednalytics Laboratory", "lab_rating": 34 }, { "lab_id": 363, "lab_name": "Neuberg Diagnostics", "lab_rating": 408 } ] }, { "city": "mumbai", "after_tat": 168, "before_tat": 54, "popularity_score": 15, "rank": 0, "discounted_price": 710, "labs": [ { "lab_id": 395, "lab_name": "Prednalytics Laboratory", "lab_rating": 34 }, { "lab_id": 380, "lab_name": "Neuberg Diagnostics", "lab_rating": 408 } ] } ] } }
需求与问题
需要统计**班加罗尔(bangalore)**地区每个实验室执行的测试数量,当前使用普通嵌套聚合按lab_id分组时,会把所有城市的实验室合并统计,无法区分城市。单条文档下期望结果:
[{"key": 395, "doc_count": 1},{"key": 363, "doc_count": 1}]
解决方案
利用多层嵌套聚合+过滤实现精准统计,DSL查询如下:
{ "size": 0, "aggs": { "enter_inventory": { "nested": { "path": "inventory_arr" }, "aggs": { "filter_bangalore": { "filter": { "term": { "inventory_arr.city": "bangalore" } }, "aggs": { "enter_labs": { "nested": { "path": "inventory_arr.labs" }, "aggs": { "group_by_lab_id": { "terms": { "field": "inventory_arr.labs.lab_id" } } } } } } } } } }
逻辑说明
- 第一层
nested聚合进入inventory_arr层级,遍历每个城市的库存条目 - 用
filter组件筛选出城市为bangalore的条目 - 第二层
nested聚合进入筛选后条目的labs层级,遍历该城市下的所有实验室 - 最后通过
terms聚合按lab_id分组,统计每个实验室的测试记录数
结果结构
返回结果中,aggregations.enter_inventory.filter_bangalore.enter_labs.group_by_lab_id.buckets即为期望的统计数据,格式与需求一致。
内容的提问来源于stack exchange,提问作者Sachin Jain
相关产品推荐
相关产品推荐

