Elasticsearch黑鸟教程5:Elasticsearch为什么在6、7版本后不再支持type了?
备注:此内容为《Elasticsearch黑鸟教程(入门系列)》之五,修订于2020年12月13日。
备注:此文内容参考自网络(部分地方进行了修订),与我之前的想法不谋而合,我之前就觉得type的出现是由于Elasticsearch被误导了,被数据库理论误导了。
Elasticsearch是一个基于Apache Lucene™的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
Elasticsearch是一种NoSQL数据库(非关系型数据库),常常与常规的关系型数据库(比如:MySQL,Oralce等)做比较,如下所示:
Elasticsearch:index --> type --> doc --> field
MySQL: 数据库 --> 数据表 --> 行 --> 列
因为关系型数据库比非关系型数据库的概念提出的早,而且很成熟,应用广泛。所以,后来很多NoSQL(包括:MongoDB,Elasticsearch等)都参考并延用了传统关系型数据库的基本概念。但是,照搬硬套的后果往往是严重的,束缚了自身的发展,而Elasticsearch已经认识到了,逐步在摆脱思维定式,尤其体现在type的演变过程中:
在 Elasticsearch 5.X 版本中,一个 index 下可以创建多个 type;
在 Elasticsearch 6.X 版本中,一个 index 下只能存在一个 type;
在 Elasticsearch 7.X 版本中,直接去除了 type 的概念,就是说 index 不再会有 type。
为何要去除 type 的概念?
因为 Elasticsearch 设计初期,是直接参考了关系型数据库的设计模式,存在了 type(数据表)的概念。但是,如此设计有点牵强,因为其搜索引擎是基于 Lucene 的, 而 Lucene 的全文检索功能之所以快,是因为 倒序索引
的存在。而这种 倒序索引
的生成是基于 index 的,而并非 type。多个type 反而会减慢搜索的速度,所以,适当的做些改变(去除 type)也是无可厚非的,属于拨乱反正之壮举。
为何不是在 6.X 版本开始就直接去除 type,而是要逐步去除type?
因为历史原因,前期 Elasticsearch 支持一个 index 下存在多个 type的,而且有很多项目在使用 Elasticsearch 作为数据库。如果直接去除 type 的概念,不仅是很多应用 Elasticsearch 的项目将面临业务、功能和代码的大改,而且对于 Elasticsearch 官方来说,也是一个巨大的挑战(这个是伤筋动骨的大手术,很多涉及到 type 源码是要修改的)。所以,权衡利弊,采取逐步过渡的方式,最终,推迟到 7.X 版本才完成 “去除 type” 这个革命性的变革。