为什么Elasticsearch7.x把type给干掉了?

一、介绍

ES7之前是有type的,属于index下,一个index可以有不同的type,ES7开始就把type这个显示概念给删除了,统一换成了_doc来表示type。也就是ES7开始一个index只能有一个type,而且这个type还是默认的_doc。

二、type的底层存储

1、概念讲解

什么是类型(type)?

从Elasticsearch的第一个发布版本以来,每一个文档都被存储在一个单独的索引里,并被赋予了一个type,一个映射类型代表着一个被索引的文档或实体的类型。

document中field的value在底层的lucene中建立索引的时候全部是二进制类型的,因为Lucene是没有type概念的,所以在document中,实际上将type作为一个document的field来存储(_type字段),然后ES通过_type来进行type的过滤和筛选。

也就是说一个index中的多个type实际上是放到一起存储的,所以一个index下不能有多个重名的type。

2、代码讲解

比如有如下两个结构的type:

{
   "test_index": {
      "mappings": {
         "mobile": {
            "properties": {
               "name": {
                  "type": "string",
               },
               "price": {
                  "type": "double"
               },
                 "xxx": {
                      "type": "string"
                 }            

            }
         },
         "computer": {
            "properties": {
               "name": {
                  "type": "string",
               },
               "price": {
                  "type": "double"
               },
                 "yyy": {
                      "type": "string"
                 }
            }
         }
      }
   }
}

type为mobile的下面有一条document如下:

{
  "name": "xiaomi",
  "price": 3999.99,
  "xxx": "abcd"
}

type为computer的下面有一条document如下:

{
  "name": "apple",
  "price": 9999.99,
  "yyy": "apple good"
}

上面那两条数据在底层存储mapping是下面这个样子的:

{
   "test_index": {
      "mappings": {
        "_type": {
          "type": "string",
          "index": "not_analyzed"
        },
        "name": {
          "type": "string"
        }
        "price": {
          "type": "double"
        }
        "xxx": {
          "type": "string"
        }
        "yyy": {
          "type": "string"
        }
      }
   }
}

可以看到type其实就是一个_type字段,字符串类型,不分词。

上面那两条数据在底层存储document是下面这个样子的:

{
  "_type": "mobile",
  "name": "xiaomi",
  "price": 3999.99,
  "xxx": "abcd",
  "yyy": ""
}
{
  "_type": "computer",
  "name": "apple",
  "price": 9999.99,
  "xxx": "",
  "yyy": "apple good"
}

3、总结

1、type是document中的一个字段_type,且类型是string,不进行分词。

2、底层会将当前index下所有type下的所有document的field都统一存放到了一个地方,对多个type的多个document进行了merge合并。

3、document1中没有yyy字段,但是也会将他放入其内,只是value为空字符串,document2同理。进一步证明了进行了merge。

4、同一个index下的不同type下的document字段名若相同,则类型一样要相同,否则会冲突报错,因为他在merge的时候不知道你这个字段是什么类型。

三、ES7.x为什么删除了type?

假设在一个index中建立很多type,并且这些type下的document都没有相同的字段,那么会导致数据极其稀疏(因为会合并,没有的字段是空字符串),影响ES的存储、检索效率。

在一个index中建立很多type,其中有两个document属于不同的type,但是这两个document的field名称一样,数据类型不一样。这时候就报错了。

四、

两种场景,大家都用过:

  • 同一个index下,不同的type,命名名称一样的字段名。

  • 同一个数据库下,不同的表,命名名称一样的字段名。

在关系型数据库中,不同的表中,包含相同的字段名是很常见的,而且它们可以做到互不干扰。

在ElasticSearch中,不同的type,如果包含相同的字段名,它们是一样的,es会认为是一个字段,模糊掉不同type的概念。所以在es里边,type这个概念没必要存在,所以es7就废弃了。

cea4c58dbb17c20a07db5b775e4c1227.jpeg

同志们,可以试一下,在同一个index中,不同的type,创建一个同名的字段,但是类型不要弄成一样的,看能否成功创建。答案是不可以,它会提示你,不可以将这个字段的类型更改为这个类型。

illegla_argument_exception

mapper [create_time_] cannot be changed from type [date] to [keyword]

所以,结论就是,es确实把不同type中的同名字段,当成了一个字段

在设计索引库的时候,同名问题一定要注意,最简单的方法就是一个index,一个type,想要其他类型,另外创建index,当然你可以用别的字段名。

注意:ES7废弃,但还在用,ES8才真正的去掉了type。

五、Elastic最新的8.6已经发布了

ES在8.x引入了很多新特性,这个系列我就来一一为大家分享下。

8.0是一个大版本,ES历经3年终于从7.x来到了8.x时代。

8.x最主要的一个变化是,终于将type从ES代码中去掉了。

关于type,是es的一个老特性。之前在ES的概念中,type定位成数据库的表。如下:

b0e8eee822d93a6549e4fc8adce2852d.jpeg

但是在ES实际的设计中,Type只是Index中的一个字段。这个怎么理解呢?

ES在实际的数据存储是以Index为单位,Index有很多shard,每个shard对应了一个lucene文件结构。

而Type只是lucene中的一个字段。这会带来很多使用上的问题:

  • type并不像数据库那样,每个type会独立文件结构,而是都在一个lucene中,这样对于一个Index中有很多 type的情况下,这些type的性能是会相互收到影响的。一些小type,本来应该查询很快,但是由于跟大type放在一起,查询就不一定快了。

  • type由于只是lucene中的一个字段,而type里的字段,es并没有加上type前缀。这带来一个types之间类型互相影响的问题,比如type a有一个foo字段是keyword类型,另一个type b如果也有foo字段,是无法定义其他类型的,写入其他类型就会报错。因为foo字段在lucene也是唯一字段,只能定义一种类型。

  • 一个type的字段可能不多,但是一个Index定位了太多type,这些type的字段不断叠加,就会导致Index字段爆炸,引发很多元数据方面的问题。

出于这些考虑,ES就在考虑去掉type。

但是去掉type,是个非常复杂的任务,主要出于对历史版本的兼容性,ES无法暴力的从功能中把type去掉。ES的读写API、mapping设置等都包含了type。如果直接去掉,历史版本的用户就无法平滑升级了。

为此ES想到了一个好办法。ES在6.x开始逐步去掉type,在8.x正式完成。中间给用户一些兼容性的过渡时间。

大概的思路如下:

  • 在6.x,ES加上了index.mapping.single_type: true的默认设置,强制用户只能使用一个type字段。如果用户还需要有多个type的需求,那么需要显式把index.mapping.single_type设置为false。

  • 在6.x,type建议用户设置为_doc,这是为接下来_doc作为一个常量准备的,ES的思路是API从PUT {index}/{type}/{id},这种改成{index}/_doc/{id}。

  • 7.x去掉了index.mapping.single_type配置,type只能设置一个,且为_doc。

  • 7.x 在mapping中把type这层去掉,这时候如果用户有兼容性问题,支持加上include_type_name为true,增加type这层,但是名称只能为_doc。

  • 8.x去掉include_type_name参数,且代码中不在依赖多 type能力。

所以到现在8.x的版本,用户再也看不到type的痕迹了。

参考:https://www.jianshu.com/p/25743ad5dd6f

 https://blog.51cto.com/u_12132623/3027241 

https://blog.csdn.net/numbbe/article/details/109656567

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/6942.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chrome扩展程序实现网页翻译

下面是谷歌翻译整个网页扩展程序包地址,github比较慢所以要耐心等待: https://github.com/FilipePS/Traduzir-paginas-web/releases/download/v9.6/TWP.9.6.Chromium.zip 步骤如下: 1、下载安装包 2、谷歌浏览器右上角三个点那里点开之后点…

DETR代码学习(五)之匈牙利匹配

匈牙利匹配先前在损失函数那块已经介绍过,但讲述了并不清晰,而且准确来说,匈牙利匹配所用的cost值与损失函数并没有关系,因此今天我们来看一下匈牙利匹配这块的代码与其原理。 前面已经说过,DETR将目标检测看作集合预…

最大连通块之DFS,BFS

纯音~ 目录 🍌前言 🍌作业 🌳一,最大连通 🌼AC DFS 剪枝 🌼AC BFS 剪枝 🌳二,1136: 最大黑区域 🌼AC DFS 剪枝 🌼AC BFS 剪枝 01矩阵本来…

hydrus模型1D/2D/3D

详情点击链接:环境土壤物理hydrus1D/2D/3D 前言 HYDRUS是由著名土壤学家Rien van Genuchten和Jirka Simunek等人基于Windows系统界面开发的环境土壤物理模拟软件,是模拟一维和多维变饱和多孔介质的水流、溶质运移、根系吸水和溶质吸收、热量传输等的强有…

华为交换机 STP 协议

环路问题 为了提高网络的可靠性,交换网络中通常会使用冗余链路。然而,在冗余链路中会给交换网络带来环路风险,并导致广播风暴以及MAC地址表不稳定等的问题,进而影响到用户的通信质量。生成树协议STP(Spanning Tree Pr…

Hadoop(伪分布式)+Spark(local模式)搭建Hadoop和Spark组合环境

一、安装Hadoop环境使用Ubuntu 14.04 64位 作为系统环境(Ubuntu 12.04,Ubuntu16.04 也行,32位、64位均可),请自行安装系统。Hadoop版本: Hadoop 2.7.4创建hadoop用户如果你安装 Ubuntu 的时候不是用的 "hadoop&qu…

数字化时代,企业的数据指标管理指南

有很多人将数据指标理解成标签,理解成传统意义上的统计指标,其实这是不对的。数据指标指的是通过对数据进行分析得到的一个汇总结果,是将业务单元精分和量化后的度量值,使得业务目标可描述、可度量、可拆解。数据指标和业务的联系…

3036: 莫比乌斯最大值isUsefulAlgorithm(2023郑州轻工业大学校赛

题意: 有n个问题和闲聊 问题的格式是’what’s S问题S_{问题}S问题​’ 闲聊的格式是 S问题S_{问题}S问题​S回答S_{回答}S回答​,S问题S_{问题}S问题​的长度>0 对于每个 S回答S_{回答}S回答​ ,只能回答在这句话之前提问的问题 那么…

二分法模板以及例题 (三)

167. 两数之和 II - 输入有序数组 输入:numbers [2,7,11,15], target 9 输出:[1,2]。 解释:2 与 7 之和等于目标数 9 。因此 index1 1, index2 2 。返回 [1, 2] 解题思路:首先散列表可以直接秒了,双指针也秒了 二分…

Weblogic RCE + confluence RCE + cacti RCE正反向代理靶场

靶场 weblogic - confluence - cacti 与实际区别 没有太多限制,没有杀软、waf靶场每个机器都是跨网段机器靶场中机器数和种类很少的多,网络复杂性低很多靶场中没有蜜罐,不需要考虑被溯源 1.网络边界Weblogic 通过外部信息收集发现其在 19…

王炸!ChatGPT这算是彻底打脸马云。。。

在2019年的世界人工智能大会上,马斯克和马云针对人工智能话题上演了一场精彩对话。马云:我不觉得AI是一种威胁,我不认为人工智能是很恐怖的东西,因为人类很聪明。马斯克:一般大家都会低估人工智能的能力,实…

「解析」Jetson orin NX烧录系统

Jetson 的系统需要通过 SDK Manager软件进行烧录,但是 SDK Manager 仅支持Linux系统,因此需要提前安装好Linux系统,个人推荐虚拟机。 1、安装 SDK Manager NVIDIA SDK Manager下载地址:https://developer.nvidia.com/drive/sdk-…

腾讯云安装docker

卸载旧版本的 Docker 列出系统中已安装的docker包: yum list installed | grep docker卸载已安装的docker包: yum -y remove docker-ce-cli.x86_64 yum -y remove docker-ce.x86_64 yum -y remove containerd.io如果系统中没有 Docker,则直…

亿信华辰全力打造金融统一监管报送平台,你值得拥有

​近年来风险管理成为未来银行的核心、金融机构监管的重中之重。亿信华辰全面整合了银监会、人民银行、外管局及其他监管机构的报送制度规范,形成了统一的监管报送架构、统一的数据模型和统一的监管报送平台。经过多年的酝酿和沉淀以及一年的开发,我们迎…

【计算机网络复习】第二章 应用层 2

WWW概述 万维网,WWW, World Wide Web 不是一个网络,而是基于因特网的信息服务系统 以C/S模式工作 n 客户程序向服务器程序提出请求 n 服务器程序向客户程序返回客户需要的万维网文档,即页面 WWW应用的客户端:浏览器 WWW应…

Hadoop分布式集群安装部署(Redhat 6.4 64位操作系统)

一、配置自动时钟同步 (管理节点:namenode) 1.查看是否安装了NTP: # rpm -q ntp ntp-4.2.4p8-2.el6.x86_64 // 这表示已安装了,如果没有安装,这是空白。2.开启ntp的自启命令: # chkconfig…

【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 &…

【云原生进阶之容器】第五章容器运行时5.4--容器运行时之Firecracker

1 Firecracker诞生背景 近些年 AWS 非常推崇无服务器模式

使用Nginx代理访问服务器的.mp4文件,并使用Vue播放

一、使用Docker部署单节点Nginx 1、在CentOS上安装部署Docker 请参考:https://blog.csdn.net/yueyue763184/article/details/126776158?spm1001.2014.3001.5502 2、拉取最新版Nginx镜像 docker pull nginx 3、创建后面需要映射的文件夹 mkdir -p /home/nginx…

鲁大师2023年Q1季度电动车报告:九号独占八榜,差异化竞争完成产品破圈

鲁大师2023年Q1季报正式发布,本次季报包含电动车智能排行,测试的车型为市面上主流品牌的主流车型,共计18款,全部按照评测维度更广、更专业的鲁大师电动车智慧评测2.0进行评分,测试的成绩均来自于鲁大师智慧硬件实验室。…
最新文章