从 Lucene 到 Elasticsearch
前面两篇文章,讲了「为什么需要 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
}
}
相关文章