您的位置:

Elasticsearch中的Nested类型详解

一、Nested类型的介绍

Elasticsearch Nested类型是指将一个对象数组作为一个字段进行索引。Nested类型是一种特殊的对象类型,它可以用来存储在嵌套对象中包含的其他对象信息。这个Nested对象可看做是一个嵌套的对象和它的子文档的集合,可以在同一个document中进行索引。

为了使用Nested类型,要使用下面三个步骤:

1、创建一个mapping

2、在该字段上使用Nested类型,并在字段中定义它内部的对象或属性

3、存储和查询数据

{
   "mappings": {
      "properties": {
         "manufacturer": {
            "type": "nested",
            "properties": {
               "name": { "type": "text" },
               "location": { "type": "geo_point" }
            }
         }
      }
   }
}

二、Nested类型的应用场景

Nested类型主要应用于以下两种情况:

1、嵌套的对象具有多个属性,每个属性都需要各自独立地搜索。

2、嵌套的对象通常会作为一个整体来搜索,比如博客文章,具有标题、正文、标签等属性。

在这些情况下,Nested类型都可以发挥出很好的效果。然而,Nested类型也存在一些缺点。Nested类型会在内存中重复保存与其相关的文档,因此在数据压缩时,内存需求量会增加。

三、Nested类型的使用方式

1、创建Mapping

Nested类型必须在索引mapping时,作为一种复合类型进行定义。

PUT nested_test
{
  "mappings": {
    "properties": {
      "name": {"type": "keyword"},
      "age": {"type": "integer"},
      "sex": {"type": "keyword"},
      "notes": {
        "type": "nested",
        "properties": {
          "title": {"type": "text"},
          "content": {"type": "text"},
          "date": {"type": "date"}
        }
      }
    }
  }
}

2、索引文档

Nested类型字段的支持直接给定内部对象的一个数组,配合它的properties实现保存、查询和表达式计算的支持。

PUT /index/_doc/1
{
  "name":"tom",
  "age":18,
  "sex":"male",
  "notes":[
    {
      "title":"note1",
      "content":"hello elasticsearch",
      "date":"2020-01-01"
    },
    {
      "title":"note2",
      "content":"hello nested type",
      "date":"2020-01-02"
    }
  ]
}

3、查询Nested类型

在查询时,Nested类型的字段要进行特殊处理。要查询内部的字段时,必须使用dot notation指明嵌套字段和其属性名称。

GET index/_search
{
  "query": {
    "nested": {
      "path": "notes",
      "query": {
        "bool": {
          "must": [
            {"match": {"notes.title": "note1"}},
            {"range": {"notes.date": {"gt":"2019-12-31"}}}
          ]
        }
      }
    }
  }
}

四、Nested类型的注意事项

1、嵌套字段不能被映射为子文档或其他同级的Object类型。

2、Nested类型内部如果有多个属性,则每个属性都是一个单独的字段。

3、Nested类型不支持聚合查询。

4、嵌套文档必须具备唯一标识。

5、查询时,必须使用Nested类型的嵌套路径。

6、存储和查询数据的性能延迟比较高。

五、总结

本篇文章通过介绍Nested类型的基本信息、使用方式及注意事项,让读者对Nested类型有了一个更深入的了解。