首页/数据/NoSQL 速查/nested 类型与嵌套查询
Elasticsearch89 条

nested 类型与嵌套查询

普通 object 数组在索引时会被扁平化,跨对象条件会互相串位;若数组内字段必须成组匹配,需要声明 nested 类型并用 nested 查询(可加 inner_hits 返回命中的子文档)。

NoSQL 速查数据更新于 2026-10-12
问题object 数组展平后,user.first 与 user.last 可以来自不同元素
方案映射声明 { "type": "nested" },查询用 nested 包裹条件
inner_hits返回具体命中的嵌套对象,便于展示与调试

示例

示例
PUT /my-index/_mapping
{
  "properties": {
    "user": {
      "type": "nested",
      "properties": {
        "first": { "type": "keyword" },
        "last": { "type": "keyword" }
      }
    }
  }
}

GET /my-index/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "term": { "user.first": "John" } },
            { "term": { "user.last": "Smith" } }
          ]
        }
      },
      "inner_hits": {}
    }
  }
}
nested 文档是独立 Lucene 文档,跨 nested 与主文档排序聚合有限制,相关度计算也分开统计。

易错点

  • nested 字段不能直接排序聚合,需要 nested 排序或在聚合里用 nested 上下文
  • 每个 nested 对象都占用独立文档开销,几十个元素的数组会明显放大索引体积

数据来源与参考

  • Elasticsearch Guide: Nested field type
  • Elasticsearch Guide: Nested query
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌