当前位置: 首页 > news >正文

【Elasticsearch教程12】Mapping字段类型之object

Elasticsearch Mapping字段类型之object

  • 一、传统数据库存object
  • 二、ES存object
    • 2.1 创建mapping
    • 2.2 插入数据
    • 2.3 查询object数据
  • 三、object不要存数组
    • 3.1 存入object数组
    • 3.2 验证错误的查询结果
  • 四、object的参数enabled

首先给出结论:

  • 在一个字段存储一个JSON对象,可以选择object类型
  • 在一个字段存储多个JSON对象,可以选择nested类型

一、传统数据库存object

假设有一个人员信息如下:

{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}

建表时会建一个字段存一个值,它的缺点是字段扁平化, 无法直观的表现层级关系

字段
regionUS
manager_age30
manager_firstnameJohn
manager_lastnameSmith

二、ES存object

ES中,一个字段存的就是一个JSON,JSON格式本身就包含嵌套的层级关系。

2.1 创建mapping

  • 一层有2个字段:regionmanager
  • manager包含2个字段: agename
  • name包含2个字段:firstlast
PUT pigg_test_object
{
  "mappings": {
    "properties": {
      "region": {
        "type": "keyword"
      },
      "manager": {
        "properties": {
          "age": {
            "type": "integer"
          },
          "name": {
            "properties": {
              "first": {
                "type": "keyword"
              },
              "last": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }
  }
}

2.2 插入数据

PUT pigg_test_object/_doc/1
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}

在ES内部,这些值其实是按如下格式存储的

{
  "region":             "US",
  "manager.age":        30,
  "manager.name.first": "John",
  "manager.name.last":  "Smith"
}

2.3 查询object数据

查询子字段时,得输入字段的全名,如manager.name.first

GET /pigg_test_object/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "manager.name.first": {
              "value": "John"
            }
          }
        }
      ]
    }
  }
}

三、object不要存数组

3.1 存入object数组

  • 30岁的John Smith
  • 40岁的Geen Hank
PUT pigg_test_object/_doc/1
{
    "region":"US",
    "manager":[
        {
            "age":30,
            "name":{
                "first":"John",
                "last":"Smith"
            }
        },
        {
            "age":40,
            "name":{
                "first":"Geen",
                "last":"Hank"
            }
        }
    ]
}

3.2 验证错误的查询结果

查询30岁的Geen按照正常理解,是不应该查询出来结果的,但是它能返回数据

GET /pigg_test_object/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "manager.age": {
              "value": "30"
            }
          }
        },
        {
          "term": {
            "manager.name.first": {
              "value": "Geen"
            }
          }
        }
      ]
    }
  }
}

这是因为在ES内部,数据会如下格式存储

{
  "region":             "US",
  "manager.age":        [30, 40],
  "manager.name.first": ["John", "Geen"],
  "manager.name.last":  ["Smith", "Hank"]
}

这样的存储方式没有把2个人信息分开存储,而是混合在一起,所以有了文章开头的结论:

  • 在一个字段存储一个JSON对象,可以选择object类型
  • 在一个字段存储多个JSON对象,可以选择nested类型

四、object的参数enabled

  • enabled参数只用于object类型,默认值是true(开启)
  • 为true时,ES会object里的所有字段进行索引操作, 这样就可以根据该字段检索文档
  • 为false时,ES不去解析object里的字段,不会索引每个字段
  • 当只需要返回该字段用于展示,而不需要索引某个字段时(例如session信息,我们很少用session作为查询条件),可设置enabled=false

实验如下:

PUT pigg_test_enabled
{
  "mappings": {
    "properties": {
      "name": {"enabled": false}
    }
  }
}

插入多种格式的值

PUT pigg_test_enabled/_doc/1
{
  "name": "winter"
}

PUT pigg_test_enabled/_doc/2
{
  "name": {
    "first_name": "wang",
    "last_name": "dong"
  }
}

GET pigg_test_enabled/_search

返回发现: 不同的值都可以存入
 "hits" : [
      {
        "_index" : "pigg_test_enabled",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "winter"
        }
      },
      {
        "_index" : "pigg_test_enabled",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : {
            "first_name" : "wang",
            "last_name" : "dong"
          }
        }
      }
    ]

查看mapping

GET pigg_test_enabled/_mapping

返回如下: name类型是object, 并不会解析name在其下面添加first_name和last_name子字段
{
  "pigg_test_enabled" : {
    "mappings" : {
      "properties" : {
        "name" : {
          "type" : "object",
          "enabled" : false
        }
      }
    }
  }
}

在enable=false的字段上检索文档, 是查询不到数据的

GET pigg_test_enabled/_search
{
  "query": {
    "term": {
      "name": {
        "value": "winter"
      }
    }
  }
}

返回没有数据

下一篇博客会详细讲解nested类型,如果本文对您有帮助,就给亚瑟王点个赞👍吧。

相关文章:

  • MATLAB算法实战应用案例精讲-【采样路径规划算法】PRM算法(附MATLAB、C++和Python等源码)
  • 常用类和内部类总结(二)
  • 蓝桥杯实战应用【算法代码篇】-如何找数组中唯一成对的那个数(附Java和C++代码)
  • 猿创征文|【Python数据科学快速入门系列 | 05】常用科学计算函数
  • WebRTC系列-SDP之setLocalDescription(2)
  • 【JavaEE初阶】多线程 _ 进阶篇 _ 锁的优化、JUC的常用类、线程安全的集合类
  • 猿创征文|JVM之自动内存管理详解
  • nodejs毕业设计基于Nodejs实现的心理健康咨询微信小程序
  • k8s 读书笔记 - 详解 Pod 调度(Ⅰ卷)
  • 如何用python一键去除图片、PDF水印?
  • 「数据结构详解·七」并查集
  • Windows OpenGL 图像反色
  • 关于参与阿里巴巴编程之夏Asoc-Nacos的感悟
  • c++ 单源最短路径-狄杰斯特拉算法
  • 2022年8月29日 勒索病毒大爆发:0day漏洞 用友T+ 组件漏洞 中毒.LOCKED 病毒分析
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • CSS相对定位
  • CSS中外联样式表代表的含义
  • ECMAScript入门(七)--Module语法
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • HTTP请求重发
  • Sass 快速入门教程
  • Selenium实战教程系列(二)---元素定位
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • Yeoman_Bower_Grunt
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 产品三维模型在线预览
  • 彻底搞懂浏览器Event-loop
  • 机器学习 vs. 深度学习
  • 前端_面试
  • 前端相关框架总和
  • 区块链分支循环
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用agvtool更改app version/build
  • 跳前端坑前,先看看这个!!
  • 一道面试题引发的“血案”
  • 用简单代码看卷积组块发展
  • 找一份好的前端工作,起点很重要
  • scrapy中间件源码分析及常用中间件大全
  • 我们雇佣了一只大猴子...
  • ​configparser --- 配置文件解析器​
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​比特币大跌的 2 个原因
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (六)vue-router+UI组件库
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .form文件_一篇文章学会文件上传
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net Core缓存组件(MemoryCache)源码解析