ES 很了不起,需要使用搜索技术的互联网公司大半都在使用他,但是它的核心引擎却是另一个开源框架 —— Lucene。ES 只是在 Lucene 的基础上穿了一件华丽的外衣,没有 ES 还会有其它产品来包装 Lucene,比如另一个仅次于 ES 的流行搜索系统 Solr,但是如果没有 Lucene,那 ES 可能就不会存在。
这就好比 TiDB 也并不是百分百的中国人自己的存储系统,它的内部存储引擎是 RocksDB,来源于 Facebook,TiDB 也只是在它的基础上穿上的一件华丽的外衣。
但是呢我们却不能小瞧这一件外衣,它的复杂程度也不亚于内部的引擎本身。Lucene 出来这么多年,市场上流行的基于 Lucene 的分布式开源搜索系统也只有 ES 和 Solr 两个。不同于我们平时常用的 Web 框架五花八门,开源的搜索系统却并不是很丰富,因为它的制造成本比 Web 框架要高出太多。
Lucene 在开源的搜索引擎里一直处于垄断地位,它的实现语言是 Java 语言。以至于开源的分布式搜索系统也不得跟着使用 Java 语言,使用其它语言克隆一个差不多的 Lucene 代价太高了 —— Lucene 的功能实在太丰富。我们在 Github 上可以搜索到 Go 语言版本的 Lucene,但是它只是一个半吊子工程,太过于简陋了,而是似乎已经很多年不再维护。
所以如果读者希望更加深入地了解搜索技术,那就必须把 Lucene 吃透。在 Lucene 非常了解的基础上再来研究 ES 就可以事半功倍。但是有一件事必须要提,那就是 Lucene 的复杂程度要比 LevelDB 高出不少,所以需要有心理准备。
在很多互联网大厂,它们通常都是自己撸的一套搜索引擎,既不会使用 Lucene,也不会使用 ES、Solr。但是这并不意味着它们自己做出的东西就比开源的出色,只不过它们为了自身的业务做了很多定制性的工作,在某些方向上可以舍弃通用型而打磨的更加极致。但是究其内部引擎的实现上他们通常都会非常频繁的参考开源实现 —— 开源技术就是一座现成的金矿,巨人的肩膀不站白不站。
Lucene 就是一个单机版的搜索引擎,就好比 LevelDB 就是一个单机版的 Key-Value 数据库一样。Lucene 最基本的功能分为写功能和读功能,写的过程就是建索引,读的过程就是使用索引。
写的过程越精致,读的过程就越准确越快速。这就好比你的高中书桌越整齐,找书的速度就越快,但是平时投入在书桌整理的时间上也就越多。这一点我深有体会 —— 因为我发现相比别人而言,我的高中书桌总是很乱,每次找书总要找很久。我也曾经尝试过要做到像他们一样,但是不出一个礼拜,书桌就再次陷入混乱。
Lucene 是 Java 语言实现的,我可能会编写一些 Java 代码来尝试 Lucene 的各种功能,希望对 Java 语言感到厌烦的同学请保持克制。不入虎穴焉得虎子,如果你看到 Java 语言就躲,那么毫无疑问你会错过很多美丽的风景线。
Lucene 内部就是一座巨大的宝藏,将这些宝藏一一挖掘出来将会给我们带来无尽的收益。在本系列的后续文章中,我们首先会对 Lucene 进行一系列的分析讲解,给搜索技术打上夯实的基础。
也许你会质疑学习 Lucene 对我们这些写业务代码的能带来什么帮助?
业务代码不过是 CRUD,不过是复制粘贴,并不需要多么高级的知识就可以完成,学习这些高级的知识不过是走马观花一边进一边出。这是一个非常好的问题,可是如果我们一直这样 CRUD,那么作为一条咸鱼该何时才能翻身呢?