嵌套聚合过滤

时间:2017-08-01 21:23:27

标签: c# elasticsearch nest

我的文档用嵌套的位置索引,

{
  "name": "name 1",
  "locations": [
     { 
       "region": "region1",
       "city": "city1",
       "suburb": "suburb1"
     },
     { 
       "region": "region2",
       "city": "city2",
       "suburb": "suburb2"
      },
      {
        region": "region1",
       "city": "city5",
       "suburb": "suburb4"
      }]
}

我的查询为

{
  "query": {
    "nested": {
      "path": "locations",
        "query": {
          "bool": {
            "must": [
              {
                "term": {
                  "locations.region.keyword": {
                    "value": "region1"
                   }
                 }
               }
             ]
           }
         }
       }
     }
   }

我想要region1的仅聚合城市。我尝试了nested个聚合,nestedfilter聚合,以及reverse嵌套。似乎没什么用。问题是因为文档随locations集合中的其他区域一起出现,即使不属于region1的城市也会汇总所有内容。

任何想法?

修改

映射:

"my_index": {
  "mappings": {
    "my_type": {
      "properties": {
        "locations": {
          "type": "nested",
            "properties": {
              "city": {
                "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                       "ignore_above": 256
                    }
                  }
                },
                "region": {
                  "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  },
                  "suburb": {
                    "type": "text",
                      "fields": {
                        "keyword": {
                          "type": "keyword",
                          "ignore_above": 256
                        }
                      }
                    }
                  }  
                },
                "name": {
                  "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            }
          }
        }  

查询:

{
  "size": 0,
  "query": {
    "nested": {
      "query": {
        "bool": {
          "must": [
            {
              "terms": {
                "locations.region.keyword": [
                  "region1"
                ]
              }
            }
          ]
        }
      },
      "path": "locations"
    }
  },
  "aggs": {
    "City": {
      "nested": {
        "path": "locations"
      },
      "aggs": {
        "City": {
          "terms": {
            "field": "locations.city.keyword",
            "size": 100,
            "order": [
              {
                "_count": "desc"
              },
              {
                "_term": "asc"
              }
            ]
          },
          "aggs": {
            "City": {
              "reverse_nested": {}
            }
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

根据您在查询中的用法假设您的映射是正确的

您可以使用下面提到的查询在聚合中使用过滤器。

{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "city_agg": {
            "nested": {
                "path": "locations"
            },
            "aggs": {
                "filter_locations_regions": {
                    "filter": {
                        "term": {
                            "locations.region.keyword": "region1"
                        }
                    },
                    "aggs": {
                        "cities_in_region_agg": {
                            "terms": {
                                "field": "locations.city.keyword",
                                "size": 100,
                                "order": [{
                                        "_count": "desc"
                                    },
                                    {
                                        "_term": "asc"
                                    }]
                                }
                            }
                        }
                    }
                }
            }
        }
    }