1.核心概念介绍

Elasticsearch的核心概念有Node、Cluster、Shards、Replicas、Index、Type、Document、Settings、MappingAnalyzer,其含义分别如下所示。

1.1 Node (节点)

Node即节点,节点是组成Elasticsearch集群的基本服务单元,集群中的每个运行中的Elasticsearch服务器都可称之为节点。

1.节点状态

在Elasticsearch集群中,节点的状态有Green、Yellow和Red三种,分别如下所述。

  • Green:绿色,表示节点运行状态为健康状态。所有的主分片和副本分片都可以正常工作,集群100%健康。
  • Yellow:黄色,表示节点的运行状态为预警状态。所有的主分片都可以正常工作,但至少有一个副本分片是不能正常工作的。此时集群依然可以正常工作,但集群的高可用性在某种程度上被弱化。
  • Red:红色,表示集群无法正常使用。此时,集群中至少有一个分片的主分片及它的全部副本分片都不可正常工作。虽然集群的查询操作还可以进行,但是也只能返回部分数据(其他正常分片的数据可以返回),而分配到这个有问题分片上的写入请求将会报错,最终导致数据丢失。

1.2 Cluster (集群)

Cluster即集群, ES的集群是由具体相同cluster.name [默认值为elasticsearch]的一个或多个Elasticsearch节点组成的,各个节点协同工作,共享数据。同一个集群内节点的名字不能重复,但集群名称一定要相同。在实际使用Elasticsearch集群时,一般需要给集群起一个合适的名字来替代cluster.name的默认值。自定义集群名称的好处是,可以防止一个新启动的节点加入相同网络中的另一个同名的集群中。在Elasticsearch集群中,节点的状态有Green、Yellow和Red三种,分别如下所述。

在实际使用Elasticsearch集群时,一般需要给集群起一个合适的名字来替代cluster.name的默认值。自定义集群名称的好处是,可以防止一个新启动的节点加入相同网络中的另一个同名的集群中。

1.3 Shards (分片)

Shards即分片,当索引的数据量太大时,受限于单个节点的内存、磁盘处理能力等,节点无法足够快地响应客户端的请求,此时需要将一个索引上的数据进行水平拆分。拆分出来的每个数据部分称之为一个分片。一般来说,每个分片都会放到不同的服务器上。

Elasticsearch依赖Lucene,Elasticsearch中的每个分片其实都是Lucene中的一个索引文件,因此每个分片必须有一个主分片和零到多个副本分片。在一个设置有多分片的索引中写入数据时,是通过路由来确定具体写入哪个分片中的,因此在创建索引时需要指定分片的数量,并且分片的数量一旦确定就不能更改。在Elasticsearch中,默认为一个索引创建5个主分片,并分别为每个主分片创建一个副本.

1.4 Replicas (备份)

Replicas即备份,也可称之为副本。副本指的是对主分片的备份,这种备份是精确复制模式。每个主分片可以有零个或多个副本,主分片和备份分片都可以对外提供数据查询服务。当构建索引进行写入操作时,首先在主分片上完成数据的索引,然后数据会从主分片分发到备份分片上进行索引。当主分片不可用时,Elasticsearch会在备份分片中选举出一个分片作为主分片,从而避免数据丢失。

备份分片既可以提升Elasticsearch系统的高可用性能,又可以提升搜索时的并发性能;另一方面,备份分片也是一把双刃剑,即如果备份分片数量设置得太多,则在写操作时会增加数据同步的负担。

1.5 Index(索引)

索引是具有相同结构的文档集合。例如,可以有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引。在系统上索引的名字全部小写,通过这个名字可以用来执行索引、搜索、更新和删除操作等。在单个集群中,可以定义多个你想要的索引。索引结构参见图1-2

1.6 Type (类型)

在索引中,可以定义一个或多个类型,类型是索引的逻辑分区。在一般情况下,一种类型被定义为具有一组公共字段的文档。例如,让我们假设你运行一个博客平台,并把所有的数据存储在一个索引中。在这个索引中,你可以定义一种类型为用户数据,一种类型为博客数据,另一种类型为评论数据。

1.7 Document(文档)

文档是存储在Elasticsearch中的一个JSON格式的字符串。它就像在关系数据库中表的一行。每个存储在索引中的一个文档都有一个类型和一个ID,每个文档都是一个JSON对象,存储了零个或者多个字段,或者键值对。原始的JSON文档被存储在一个叫作_source的字段中。当搜索文档的时候默认返回的就是这个字段。

1.8 Term (索引词)

在Elasticsearch中索引词(term)是一个能够被索引的精确值。foo、Foo、FOO几个单词是不同的索引词。索引词(term)是可以通过term查询进行准确的搜索。

1.9 Text (文本)

文本是一段普通的非结构化文字。通常,文本会被分析成一个个的索引词,存储在Elasticsearch的索引库中。为了让文本能够进行搜索,文本字段需要事先进行分析;当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本。

1.10 Analysis (分析)

分析是将文本转换为索引词的过程,分析的结果依赖于分词器。比如:FOO BAR、Foo-Bar和foo bar这几个单词有可能会被分析成相同的索引词foo和bar,这些索引词存储在Elasticsearch的索引库中。当用FoO:bAR进行全文搜索的时候,搜索引擎根据匹配计算也能在索引库中搜索出之前的内容。这就是Elasticsearch的搜索分析。

1.11 Mapping (映射)

映射像关系数据库中的表结构,每一个索引都有一个映射,它定义了索引中的每一个字段类型,以及一个索引范围内的设置。一个映射可以事先被定义,或者在第一次存储文档的时候自动识别。

1.12 Field (字段)

文档中包含零个或者多个字段,字段可以是一个简单的值(例如字符串、整数、日期),也可以是一个数组或对象的嵌套结构。字段类似于关系数据库中表的列。每个字段都对应一个字段类型,例如整数、字符串、对象等。字段还可以指定如何分析该字段的值。

1.13 Source Field (来源字段)

默认情况下,你的原文档将被存储在_source这个字段中,当你查询的时候也是返回这个字段。这允许你可以从搜索结果中访问原始的对象,这个对象返回一个精确的JSON字符串,这个对象不显示索引分析后的其他任何数据。

1.14 ID (主键)

ID是一个文件的唯一标识,如果在存库的时候没有提供ID,系统会自动生成一个ID,文档的index/type/id必须是唯一的。

2.核心概念与MYSQL对比

ElasticSearch MYSQL
Index(索引) Database(数据库)
Type(类型) Table(表)
Document(文档) Row(表中每行记录)
Field (字段) Column(字段)
Mapping (映射) Schema(表结构)