关于 Elasticsearch 移除 type 的简要说明

Posted Mulavar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 Elasticsearch 移除 type 的简要说明相关的知识,希望对你有一定的参考价值。

之前碰到该问题在网上查阅了部分博客,后面阅读官网文档后发现大部分博客所描述的 Es 版本和其所做的关于移除 type 的工作的映射关系是错误的,因此在这里对官网文档精简翻译了一下,简要说明下为什么 Es 要移除 type,以及 Es 是怎么移除 type 的。

1. 为什么要移除 type?

我们经常会用 mysql 的知识来理解 es 的一些概念,比如将 es 的 index 类比成 database,将 type 类比成 table,但这个比喻实际上是不准确的。在 MySQL 中,table 之间是相互独立的,每个表有自己的 schema,每个表都可以有相同的列名,同时支持不同的类型,比如表 A 的 age 列是 tinyint,而表 B 的 age 列是 varchar(10),但在 es 中,相同名字的字段的 mapping 定义必须是一致的,因为在底层 Lucene 只会存一份。

在这个基础上,如果在一个 index 内存了多个 type,且这些 type 之间只有极少共用的字段,会使得数据过于离散,从而影响 Lucene 的压缩性能。

2. Es 为了移除 type 做了哪些工作

移除 type,从字面上就能看出是一个非常大的变动,因此 es 尽可能地提供了平滑的升级方式。

2.1 Elasticsearch 5.6.0

通过对 index 设置参数 index.mapping.single_type: true 就能够启用单 index 单 type 限制(一个 index 只能支持一个 type),同样该限制从 6.0 版本开始该限制会强制启用。

2.2 Elasticsearch 6.x

在 Elasticsearch 6.x 中,一个 index 只能支持一个 type,推荐的 type 名字为 _doc(这样可以在 API 方面向后兼容 7.x 。

在 Elasticsearch 6.8 中,Elasticsearch 引入了一个参数控制 type 开关:include_type_name,默认值为 true,表示仍使用 type,手动设置为 false 后,请求 es 的 API 将不再包含 type,而是使用类 PUT /{index}/_doc/{id} 的格式。

2.3 Elasticsearch 7.x

在 Elasticsearch 7.x 中,include_type_name 被默认置为 false,新的 index API 格式为 PUT /{index}/_doc/{id}POST {index}/_doc 。需要注意的是,_doc 并不是一个 type ,而仅仅是 API 请求路径中永久的一部分。

2.4 Elasticsearch 8.x

在 Elasticsearch 8.x 中,include_type_name 已被删除,同时也表示 es 不再支持任何自定义 type 。

3. 参考资料

官方文档

以上是关于关于 Elasticsearch 移除 type 的简要说明的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 6.0 一个索引只允许有一个type

ElasticSearch_09_ES 7.x版本的两个变动

ElasticSearch_09_ES 7.x版本的两个变动

Elasticsearch 7 : 关于 IndexTypeDocument

Elasticsearch 7 : 关于 IndexTypeDocument

Elasticsearch 7 : 关于 IndexTypeDocument