嵌套(nested)聚合

一个特殊的单桶聚合,可以聚合嵌套(nested)文档。

例如,假设我们有一个产品索引,每个产品都有一个经销商列表——每个经销商都有自己的产品价格。映射(maping)可能是这样的:

PUT /products
{
    "mappings": {
        "properties" : {
            "resellers" : { 
                "type" : "nested",
                "properties" : {
                    "reseller" : { "type" : "text" },
                    "price" : { "type" : "double" }
                }
            }
        }
    }
}

resellers是保存嵌套文档的数组。

下面这个请求添加了一个产品,这个产品有两个经销商:

PUT /products/_doc/0
{
  "name": "LED TV", 
  "resellers": [
    {
      "reseller": "companyA",
      "price": 350
    },
    {
      "reseller": "companyB",
      "price": 500
    }
  ]
}

我们对name属性使用动态映射(索引的映射中没有定义)

下面这个请求返回产品的最低购买价格:

GET /products/_search
{
    "query" : {
        "match" : { "name" : "led tv" }
    },
    "aggs" : {
        "resellers" : {
            "nested" : {
                "path" : "resellers"
            },
            "aggs" : {
                "min_price" : { "min" : { "field" : "resellers.price" } }
            }
        }
    }
}

正如你在上面看到的,nested 聚合需要顶层文档中嵌套文档的路径(path)。 然后可以在这些嵌套文档上定义任何类型的聚合。

响应:

{
  ...
  "aggregations": {
    "resellers": {
      "doc_count": 2,
      "min_price": {
        "value": 350
      }
    }
  }
}