关于|关于 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 的简要说明】官方文档
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- 醒不来的梦
- 关于自我为中心的一点感想
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 关于Ruby的杂想
- 关于读书的思考
- 关于this的一些问题(1)
- 《声之形》
- 关于如何沟通的1/2/3