一文读懂elasticsearch版本升级type的变化

本文介绍了Elasticsearch中type属性的由来及其被逐步废弃的原因。type曾用于区分索引内的不同类型,但因其与关系型数据库概念的混淆,导致了一系列问题。随着版本更新,type在8.X版本中被彻底移除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

type属性的由来

从Elasticsearch的第一个发布版本以来,每一个document都被存储在一个单独的index里,并被赋予了一个type,一个mapping代表一个type相关的数据类型以及索引类型。

例如,一个twitter索引可能有一个user类型和tweet类型。

每种type都有他自己的字段,所以user类型可能有一个full_name字段,一个user_name字段和一个email字段,而一个tweet类型可能有一个content字段,一个tweet_at字段,和user类型一样一个user_name字段。

每一个文档类型都有一个_type元字段来存储type名称,并且根据URL里指定的类型名称,查询(搜索)被限定在一个或多个类型(type)里:

GET /twitter/user,tweet/_search
{
  "query": {
    "match": {
      "user_name": "nicola"
    }
  }
}

type为什么被干掉了

但是不知道何时起,有人将elasticsearch对标关系型数据库中的概念,这样便于理解,也便于处理问题,于是就有了下面的关系:

elasticsearchrdbmsdescription
indexdb数据库
typetable数据表
documentrow数据行
fieldcolumn数据列
mappingschema数据结构/类型

 

 

 

 

 

 

 

看上面的对照关系,一切都很完美,完全匹配,但是这也是一把双刃剑,玩惯了rdbms的人可能“误会”了elasticsearch,并按照rdbms的思想去构建elasticsearch,结果很快就发现了无数的坑,比如:

在关系型数据库里,table是相互独立的,一个table里的column和另外一个table的同名column没有关系,互不影响。但在type里字段却不是这样的。在一个Elasticsearch的index里,所有不同type的同名column内部使用的是同一个lucene字段存储。举例来说,user类型的user_name字段和tweet类型的user_name字段是存储在一个field里的,两个类型里的user_name必须有一样的field定义。

这可能导致一些问题,例如你希望同一个索引中"create_time"字段在一个类型里是存储日期值,在另外一个类型里存储字符串。

另外,按照Lucene存储的方式和特点,如果按照此种方式组织数据,会影响到底层的压缩比例和存储效率。

基于上面的原因,type在被误解后处于尴尬的地位,慢慢的版本迭代就被干掉了,在干掉一层数据结构后,es的数据结构变的简单明了,便于理解。

type的版本迭代

  • 5.x及以前版本一个index有一个或者多个type
  • 6.X版本一个index只有一个index
  • 7.X版本移除了type,type相关的所有内容全部变成Deprecated,为了兼容升级和过渡,所有的7.X版本es数据写入后type字段都默认被置为_doc
  • 8.X版本完全废弃type

type跨版本适配

  • 针对6.X版本升级到7.X的数据,使用restful api查询es时不需要指定type即可以进行查询、结果与指定对应的type进行查询、type使用_doc进行查询效果是一样的
  • 针对6.X版本升级到7.X的数据,使用restful api写入es时,不能指定type,如果处于某种原因必须指定type,则可以将type指定为_doc(比如使用6.X的restful api,这种场景详见一文讲解Elasticsearch java restful api 跨版本兼容解决方案),如果id相同,则数据会被覆盖,但是type保持原来的值,不会出现一个id对应多条数据的情况;如果id不相同,则会新写入一条type为_doc的数据
  • 如果为了将来兼容和支持高版本的elasticsearch,建议使用restful client去支持elasticsearch相关的操作,并且尽量不要在api中有type这个参数,就算必须要需要,也建议在源生api中再封装一层,否则后续版本升级,适配的工作量会让你崩溃

最后贴一张图来说明type的演进史:

elastic

### Elasticsearch 版本升级指南 #### 选择合适的升级路径 对于Elasticsearch版本升级,推荐遵循官方文档中的指导来规划升级路线。通常情况下,应该按照主要版本逐步升级,而不是跨多个大版本直接升级。例如,从5.2.2到7.8.0的最佳实践是先升至同一主版本内的最新次版本(如5.6.16),再过渡到下一个主版本直至目标版本[^2]。 #### 备份数据 在执行任何类型的数据库迁移之前,确保已经创建了一个完整的集群快照作为备份措施。这一步骤至关重要,因为如果出现问题可以迅速恢复原始状态而不影响业务连续性。 #### 测试环境验证 在一个独立于生产系统的测试环境中先行实施计划好的变更操作,并进行全面的功能性和性能测试。确认新旧功能均能正常运作之后才考虑向真实场景推进。 #### 更新配置文件 随着不同版本间可能存在API变化或新增特性,在正式部署前需仔细审查并调整`elasticsearch.yml`等相关设置项以匹配当前需求。 #### 插件兼容性检查 部分第三方插件可能并不支持最新的ES发行版;因此要提前评估现有依赖关系并对不兼容的部分寻找替代方案或者等待开发者提供更新后的版本。 ```bash # 示例命令用于查看已安装插件列表及其对应版本号 bin/elasticsearch-plugin list ``` #### 数据重新索引 当遇到存储结构发生改变的情况时,则有必要对已有记录做一次全面重写处理以便充分利用新版引擎带来的优化效果。 #### 官方资源利用 始终关注官方网站发布的公告以及社区论坛里的讨论帖,从中获取最及时有效的帮助和支持信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值