从 Lucene 到 Elasticsearch

2020-05-27 00:00:00 索引 集群 节点 分片 副本

前面两篇文章,讲了「为什么需要 Elasticsearch」,以及「Elasticsearch 的倒排索引」。

其实,这两篇文章都不是在讲 Elasticsearch。

为什么需要 Elasticsearch,其实是在讲为什么需要搜索引擎;

Elasticsearch 的倒排索引,其实是 Lucene 的 倒排索引。

那么什么才是 Elasticsearch 特有的呢?

一切都要从一位爱做饭的老婆说起。

食谱的故事

那一年,伦敦,Shay Banon 在找工作,他老婆在烹饪学校学习厨艺。

Shay 发现,老婆每天都要在大量的食谱中找自己想要的那份食谱,于是在找工作之余,开始给老婆做一个食谱搜索的工具。

市面上的搜索引擎,似乎没什么选择,只有 Lucene,但是 Lucene 又很难用,于是 Shay 在外面又抽象了一层,屏蔽了 Lucene 底层的复杂逻辑。

Shay 开源了这套给老婆搜索食谱用的系统,叫 Compass.

后来, Shay 找到了工作,他发现之前写的那套系统,在追求高性能、高可用的生产环境,实在太脆弱,于是又重新写了一套,Compass 也改名为了 Elasticsearch.

Shay 在把 Compass 重写为 Elasticsearch 时,面对的问题,其实就是:

你已经拥有了 Lucene,拥有了倒排索引,如何用它们来创造一个,让用户用起来特别爽、又特别可靠的搜索引擎?

Now,让我们跟着 Shay 的脚步,一起设计一个高性能高可靠的 Elasticsearch 吧!

开始

Shay 现在拥有的一切:

  • Lucene:一个开源的搜索库
  • Engine:屏蔽 Lucene 操作细节的抽象层
  • Http:对外提供 restful api,让不同开发语言的应用都可以接入

简单画个图:


空节点

现在我们屏蔽 Elasticsearch 的底层实现,其实一个 Elasticsearch 实例对于我们来说,就是一个节点,一个可以提供数据搜索和探寻能力的节点:

一开始,里面空空如也,什么都没有。

加点东西

Mysql 往数据库插入数据之前,需要先创建表,指定字段、主键等等,Elasticsearch 也需要创建“表”。

在 Elasticsearch 的领域语言里,「表」被称为「索引」,「行数据」被称为「文档」。

现在我们往节点里面定义一个「索引」blog:

PUT /blogs
{
   "settings" : {
      "number_of_shards" : 3,
      "number_of_replicas" : 1
   }
}

相关文章