Elasticsearch中的nested数据类型

67 阅读2分钟

nested类型是特殊的对象数据类型,但是已经有对象数据类型了,为什么还要有nested呢? 下面举一个例子说明一下对象数据类型的局限性 首先先创建一个索引,一个字段是object类型,一个字段是nested类型

PUT test_nested
{
  "mappings": {
    "properties": {
      "user_object":{
        "type": "object"
      },
      "user_nested":{
        "type": "nested"
      }
    }
  }
}

PUT test_nested/_mapping
{
  "properties": {
      "name":{
        "type": "keyword"
      }
    }
}

在索引中插入2条数据,每一条数据中的user_object都是一个对象数组

PUT test_nested/_doc/1
{
  "name":"小米",
  "user_object":[
      {
        "name": "天明",
        "description": "忠实粉丝"
      },
      {
        "name": "玉儿",
        "description": "初次尝试"
      }
    ]
}

PUT test_nested/_doc/2
{
  "name":"华为",
  "user_object":[
      {
        "name": "盖聂",
        "description": "遥遥领先"
      },
      {
        "name": "卫庄",
        "description": "支持国产"
      }
    ]
}

这时候我们搜索name等于"天明",description等于"初次尝试",会发现搜索出来的数据并不正确

#测试object数组
GET test_nested/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "user_object.name": "天明"
          }
        },
        {
          "match": {
            "user_object.description": "初次尝试"
          }
        }
      ]
    }
  }
}

image.png 这是因为Elasticsearch 没有内部对象的概念,对于上面的对象数组Elasticsearch会转化为下面的形式进行存储

{
  "name" :        "小米",
  "user_object.name" : [ "天明", "玉儿" ],
  "user_object.description" :  [ "忠实粉丝", "初次尝试" ]
}

也就是说对象数组是不能对单个对象进行精准搜索的,这时候我们在使用nested类型测试一下,首先先插入2条数据,user_nested字段是nested类型的,上面mapping中定义了

PUT test_nested/_doc/3
{
  "name":"小米",
  "user_nested":[
      {
        "name": "天明",
        "description": "忠实粉丝"
      },
      {
        "name": "玉儿",
        "description": "初次尝试"
      }
    ]
}

PUT test_nested/_doc/4
{
  "name":"华为",
  "user_nested":[
      {
        "name": "盖聂",
        "description": "遥遥领先"
      },
      {
        "name": "卫庄",
        "description": "支持国产"
      }
    ]
}

搜索测试一下,会发现是搜索不到数据的

image.png 改变一下条件搜索一下,会发现我们想要的那个对象搜索出来了,这是因为嵌套对象将数组中的每个对象作为单独的隐藏文档进行索引,这样就可以精确搜索到单个对象了

image.png

参考链接:嵌套字段类型 |Elasticsearch 指南 [8.6] |弹性的

以上的内容在官方文档中都可以找到,不过最好还是自己测试一遍比较印象深刻,哈哈