Link Search Menu Expand Document Documentation Menu

嵌套聚合

nested 聚合允许您对嵌套对象内部的字段进行聚合。nested 类型是对象数据类型的一个特殊版本,它允许以一种可以彼此独立查询的方式索引对象数组

使用 object 类型时,所有数据都存储在同一个文档中,因此搜索的匹配项可以跨子文档。例如,假设有一个 logs 索引,其中 pages 映射为 object 数据类型

PUT logs/_doc/0
{
  "response": "200",
  "pages": [
    {
      "page": "landing",
      "load_time": 200
    },
    {
      "page": "blog",
      "load_time": 500
    }
  ]
}

OpenSearch 会合并看起来像这样的实体关系的所有子属性

{
  "logs": {
    "pages": ["landing", "blog"],
    "load_time": ["200", "500"]
  }
}

因此,如果您想使用 pages=landingload_time=500 搜索此索引,即使 landing 的 load_time 值为 200,此文档也符合条件。

如果您想确保此类跨对象匹配不会发生,请将字段映射为 nested 类型

PUT logs
{
  "mappings": {
    "properties": {
      "pages": {
        "type": "nested",
        "properties": {
          "page": { "type": "text" },
          "load_time": { "type": "double" }
        }
      }
    }
  }
}

嵌套文档允许您索引相同的 JSON 文档,但会将您的页面保留在单独的 Lucene 文档中,从而使诸如 pages=landingload_time=200 之类的搜索返回预期结果。在内部,嵌套对象会将数组中的每个对象索引为单独的隐藏文档,这意味着每个嵌套对象都可以独立于其他对象进行查询。

您必须指定一个相对于父级的嵌套路径,该路径包含嵌套文档

GET logs/_search
{
  "query": {
    "match": { "response": "200" }
  },
  "aggs": {
    "pages": {
      "nested": {
        "path": "pages"
      },
      "aggs": {
        "min_load_time": { "min": { "field": "pages.load_time" } }
      }
    }
  }
}

示例响应

...
"aggregations" : {
  "pages" : {
    "doc_count" : 2,
    "min_load_time" : {
      "value" : 200
    }
  }
 }
}
剩余 350 字符

有问题?

想要贡献?