ElasticSearch基本概念

ElasticSearch是一个基于Lucene构建的开源、分布式、RESTful接口全文搜索引擎。ElasticSearch还是一个分布式文档数据库,其中每个字段都是被索引的可被搜索的数据。它能够扩展至数以百计的服务器存储,以及处理PB级的数据。可以在很短的时间内存储、搜索和分析大量的数据。

索引词(term)

在ES中索引词是一个能够被索引的精确值。如:Hello、HELLO、hello是不同的索引词。索引词是可以通过Term查询进行准确搜索。

文本(text)

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

分析(analysis)

分析是将文本转换为索引词的过程,分析的结果依赖于分词器。比如:Hello-World、Hello World 都可能会被拆分成hello 和 world,这些索引词存储在ES的索引库中。当使用hEllo wOrld进行全文检索时,搜索引擎也能在索引库中搜索出之前的内容,这就是ES的搜索分析。

集群(cluster)

集群是由一个或多个节点组成的,对外提供存储和检索功能。ES集群有个默认的名称“ElasticSearch”,当一个节点名称设置为ElasticSearch时,会自动加入该集群(一个节点只能加入一个集群)。

节点(node)

一个节点本质上就是一个Java进程,一台机器上可以运行多个ES进程。节点是集群的一部分,可以存储数据并参与集群的索引和搜索功能。节点也有唯一的名称,在启动的时候分配。使用者可以使用默认节点名称,也可以自定义节点名称。ES集群是通过节点名称对节点进行通信和管理的。当一个节点启动时,如果网络通畅会直接加入相同集群名称的集群中(默认ElasticSearch)。如果只有一个节点,那就是只有一个节点的,集群名称为ElasticSearch的ES集群。

不同的节点承担着不同的角色:

主节点(Master-eligible Node)

每个节点启动后,默认就是Master Eligible 节点,Master eligible节点可以参与主节点选举,最终成为主节点。当然也可以通过node.master:false来禁止节点参与选举。当集群中第一个节点启动时,会将自己选举为Master节点。每个节点都保存了集群的状态,只有Master节点可以修改集群状态信息。集群状态信息主要包含了以下信息:

1、所有节点信息;

2、所有的索引信息及相关的Mapping和Setting;

3、分片的路由信息;

数据节点(Data Node)

可以保存数据的节点,负责保存分片数据。一个节点默认就是数据节点,可以通过 node.data:false 来禁止成为数据节点。默认情况下,节点同时是Master-Eligible和Data Node。但是在生产环境中,通常需要分离Master-Eligible节点和Data节点。

客户端节点(Coordinate Node)

负责接收Client的请求,将请求分发到合适的节点,并最终将结果汇总返回给客户端。每个节点默认都是Coordinate 节点。在线上环境中,通常通过 node.master:false + node.data:false 来禁用Master Eligible 和Data Node的职责,从而可以让该节点只保留Coordinate的职责。

部落节点(Tribe Node )未来将会废弃

Tribe Node允许该节点在多个集群中充当联合客户端。Tribe Node 从所有连接的集群中收集信息,并合并成全局集群状态。有了这些信息,就可以对所有集群的节点执行读写操作。Tribe Node需要能够连接到每个集群中的各个节点。

路由(routing)

当存储一个文档时,它会存储到唯一的主分片中。具体是哪个分片是通过Hash算法得到。默认情况下,这个Hash值是由文档的ID计算得到。如果文档有一个指定的父文档,则根据父文档的ID生成。

分片(shard)

分片是单个Lucene实例,索引会指向主分片和副本分片的逻辑空间。对于使用者而言,只需要指定分片的数量,不需要关心其他的事情。ES会自动管理集群中所有的分片,当故障发生时,ES会把分片迁移到其他节点或者添加新的节点。

一个索引可以存储数据量很大的数据,当存储量超过一个节点的物理存储限制时,ES可以将索引分成多个分片。创建一个索引时,可以指定分片的数量。每个分片本身是一个全功能的、独立的单元,可以托管在集群中的任何节点。

主分片(primary shard)

每个文档最终都会分配到一个分片中。当写入一个文档时,ES首先会存储在主分片中,然后会被复制到不同的副本中。默认情况下,一个索引会有5个分片(可在创建索引时指定),分片一旦建立,其数量则不可更改。

副本分片(replica shard)

每个分片有0个或者多个副本,副本主要是主分片的复制,主要有如下目的:

1、增强高可用:当主分片宕机时,可以从副本分片中选取一个作为主分片;

2、提升性能:当进行查询时,可以从主分片或者副本分片中进行查询。默认情况下一个主分片会配有1个副本分片,但是不同分片不可以存储在相同的节点上。

分片的设定

对于生产环境的分片设定,需要提前规划好容量。如果分片数设置过小,则后续无法通过增加节点达到水平扩展。如果分片数过大,可能会影响搜索结果相关性打分,影响统计结果的准确性。单个节点上分片数过多,会造成资源的浪费,并且会影响性能。从ES7.0开始,默认的分片由5改成了1,解决了Over Sharding的问题。

复制(replica)

复制的意思就是数据冗余备份,复制的数据和元数据不可以在相同的节点上,要不然就失去备份本身的意义了。默认情况下,一个索引会分配5个分片,每个分片会有一个副本分片。因此默认情况下,创建一个索引会有5个主分片,5个副本分片,共计10个分片。

索引(index/type)

索引是具有相同结构的文档集合,可以等同的对比为关系型数据库中的表。如一个商品索引、一个订单索引等。在ES中索引的名字全部都是小写,通过索引的名称可以执行索引(写入)、搜索、更新和删除等。在一个集群中,你可以定义多个你想要的索引。也可以同等类比为:在一个数据库中创建多张表。

​​​​​​​文档(document)

文档是存储在ES中的一个JSON格式的字符串,可以类比为关系型数据库中的一个数据行。每个文档都有对应的类型和ID。每个文档都是一个JSON对象,存储了0个或多个字段。原始的JSON文档被存储在一个叫作_source的字段中。当搜索文档时,默认返回的就是这个字段。

映射(mapping)

映射可以类比为关系型数据库中的表定义(DDL),每个索引都有一个映射,它定义了索引中的每一个字段类型。映射可以被提前定义,也可以在文档第一次写入时自动识别创建。

字段(field)

字段和关系型数据库中的字段(列)类似,字段可以是简单的类型:如字符串、整数、日期等,也可以是一个数组或者对象嵌套结构。字段还可以指定如何分析该字段的值。

来源字段(source field)

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

主键(ID)

ID是一个文档的唯一标识,如果写入的时候没有指定ID,ES会自动生成一个ID。文档的index/type/id必须是唯一的。


参考:《ElasticSearch技术解析与实战》、《极客时间:ElasticSearch核心技术与实战》