欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Elasticsearch(017):es常见的字段映射类型之嵌套类型(nested)

程序员文章站 2022-04-23 15:41:20
...

es中的嵌套类型(nested)

之前在对象类型(object)小节中,我们提到假如需要索引字段是对象数组,而不是对象,这时我们需要使用嵌套数据类型

形如下面的示例数据结构。

{
  "group" : "fans",
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

我们可以user属性是一个对象集合。这种结构我们在创建映射时该怎么定义呢?

假如user字段是对象数组字段(嵌套数据类型)

示例如下

#创建映射的参数
PUT example/docs/_mapping
{
    "group": {
        "type": "text"
    },
    "user": {
        "type": "nested"
        "properties": {
            "id": {"type": "keyword"},
            "name": {"type": "text"},
            "age": {"type": "short"}
        }
    }
}

假如数据结构定义好了之后,我们想要新增一个文档(document),该怎么办?

示例如下

PUT example/docs/12313213123
{
    "group": "研发组",
    "user": [
        {
            "id": 1,
            "name": "张三",
            "age": 22
        },
        {
            "id": 2,
            "name": "李四",
            "age": 19
        },
        {
            "id": 3,
            "name": "tom",
            "age": 21        
        }
    ]
}

假如我们想对嵌套中的username属性进行搜索

示例如下

GET examaple/docs/_search
{
    "query": {
        "nested": {
            "path": "user",
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "user.name": "李四"
                            }
                        }
                    ]
                }
            }
        }
    }
}

注意

  1. 由于嵌套文档被索引为单独的文档,因此只能在nested查询。

  2. 为具有100个嵌套字段的文档建立索引实际上是为101个文档建立索引,因为每个嵌套文档都被索引为一个单独的文档。为了防止定义不正确的映射,每个索引可以定义的嵌套字段的数量默认为限制为50