下面来通过 lucene 引出 Elasticsearch 的核心概念
1、lucene 和 elasticsearch 的前世今生
lucene 是最先进、功能强大的搜索库。但是直接基于 lucene 开发,会非常的复杂。它的 api 很复杂,只是实现一些简单的功能,可能就需要写大量的 java 代码。要用好 lucene,需要深入了解其内部原理,包括各种索引结构。而 elasticsearch,它是基于 lucene,隐藏了 lucene 的复杂性,对外提供简单易用的 restful api 接口、java api 接口等等。关于 elasticsearch 的一个传说,据说有一个程序员失业了,陪着老婆去英国伦敦学习厨师课程。看着老婆每次查找菜谱特别费劲,于是就想给老婆写一个菜谱搜索引擎,准备使用 lucene,但是发现 lucene 实在是太复杂了,就开发了一个封装了 lucene 的开源项目,compass。后来程序员找到工作了,是做分布式的高性能项目的,就觉得自己封装的开源项目 compass 也不够用了,就写了 elasticsearch,让 lucene 变成分布式的系统。
2、elasticsearch 的核心概念
(1)Near Realtime(NRT): 近实时,两层意思,一个是写入数据到数据可以被搜索到有一个小延迟(大概 1s 左右),一个是基于 ES 执行搜索和分析可以达到秒级(2)Cluster: 集群,包含多个节点,每个节点属于哪个集群是通过一个叫做集群名称的配置来决定的。对于中小型应用来说,刚开始一个集群就一个节点很正常(3)Node: 节点,集群中的一个节点,节点也有一个名称默认是随机分配的,也可以手动指定,当我们在执行运维管理操作的时候节点的名称很重要(4)Document&field:文档,es 中最小的数据单元。一个 document 可以是一条客户数据,一条商品分类数据,一条订单数据,通常用 JSON 数据结构表示,每个 index 的 type 中都可以去存储多个 document。一个 document 里面有很多个 field,每个 field 就是一个数据字段。(5)Index: 索引,包含一堆有类似结构的文档数据。比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个 index 包含很多 document,一个 index 就代表了一类类似的或者相同的 document。比如说建立一个 product index, 商品索引,里面可能就存放了所有的商品数据,所有的商品 document。(6)Type: 类型,每个索引里都可以有一个 type,之后更高级的版本可能会去掉这一个概念。type 是 index 中的一个逻辑数据分类,一个 type 下的 document,都有相同的 field,比如博客系统,有一个索引,可以定义用户数据 type(7)shard: 分片,单台机器无法存储大量数据,es 可以将一个索引中的数据切分为多个 shard,分布在多台服务器上存储。有了 shard 就可以横向扩展,存储更多的数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个 shard 都是一个 lucene index。(8)replica: 任何一个服务器随时可能故障或宕机,此时 shard 可能就会丢失,因此可以为每个 shard 创建多个 replica 副本。replica 可以在 shard 故障时提供备用服务,保证数据不丢失,多个 replica 还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认是 5 个),replica(随时修改数量,默认是 1 个)。默认每个索引 10 个 shard,5 个 primary shard,5 个 replica shard,最小的高可用配置是 2 台服务器
3、elasticsearch 核心概念和数据库核心概念
Elasticsearch | Document | Index (Type) 数据库 | 行 | 表