如何在elasticsearch中进行两个嵌套聚合?

时间:2017-11-12 22:08:29

标签: elasticsearch nested aggregation elasticsearch-5

城市和家庭类型是以下文档映射中的两个嵌套对象:

"mappings" : {
  "home_index_doc" : {
    "properties" : {
      "city" : {
        "type" : "nested",
        "properties" : {
          "country" : {
            "type" : "nested",
            "properties" : {
              "name" : {
                "type" : "text"
              }
            }
          },
          "name" : {
            "type" : "keyword"
          }
        }
      },
      "home_type" : {
        "type" : "nested",
        "properties" : {
          "name" : {
            "type" : "keyword"
          }
        }
      },
      ...
    }
  }
}

我正在尝试进行以下聚合: 获取所有现有文档并显示每个城市的所有home_types。

我想它看起来应该类似于:

"aggregations": {
  "all_cities": {
    "buckets": [
      {
        "key": "Tokyo",
         "doc_count": 12,
         "home_types": {
            "buckets": [
               {
                  "key": "apartment", 
                  "doc_count": 5
               },
               {
                  "key": "house",
                  "doc_count": 12
               }
            ]
         }
      },
      {
        "key": "New York",
         "doc_count": 1,
         "home_types": {
            "buckets": [
               {
                  "key": "house", 
                  "doc_count": 1
               }
            ]
         }
      }
    ]
  }
}

在尝试了gazzilion aproaches和组合后,我已经用Kibana做到了这一点:

GET home-index/home_index_doc/_search
{
  "size": 0,
  "aggs": {
    "all_cities": {
     "nested": {
         "path": "city"
      },
      "aggs": {
        "city_name": {
          "terms": {
            "field": "city.name"
          }
        }
      }
    },
    "aggs": {
      "all_home_types": {
        "nested": {
          "path": "home_type"
        },
        "aggs": {
          "home_type_name": {
            "terms": {
              "field": "home_type.name"
            }
          }
        }
      }
    }
  }
}

我得到以下异常:

    "type": "unknown_named_object_exception",
    "reason": "Unknown BaseAggregationBuilder [all_home_types]",

1 个答案:

答案 0 :(得分:7)

您需要使用reverse_nested以便在根级别跳出city嵌套类型,并为nested嵌套类型执行另一个home_type聚合。基本上,像这样:

{
  "size": 0,
  "aggs": {
    "all_cities": {
      "nested": {
        "path": "city"
      },
      "aggs": {
        "city_name": {
          "terms": {
            "field": "city.name"
          },
          "aggs": {
            "by_home_types": {
              "reverse_nested": {},
              "aggs": {
                "all_home_types": {
                  "nested": {
                    "path": "home_type"
                  },
                  "aggs": {
                    "home_type_name": {
                      "terms": {
                        "field": "home_type.name"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}