目录
逐层拆分ElasticSearch的概念
-
Cluster:集群,Es是一个可以横向扩展的检索引擎(部分时候当作存储数据库使用),一个Es集群由一个唯一的名字标识,默认为“elasticsearch”。在配置文件中指定相同的集群名,Es会将相同集群名的节点组成一个集群。
-
Node:节点,集群中的任意一个实例对象,是一个节点
-
Index:索引,存放相同类型数据的一个集合,索引有唯一的名字,相比于关系型数据库,可以理解为一个表(6.0.0废除type之后)
-
Shard:分片,物理存储单位,创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上。
-
Replication:副本,对数据的备份,主要针对分片进行备份,即分片的备份
-
Document:文档,具体存储的数据(json结构)
如上图,每个云朵代表一个Es集群Cluster
,集群中由一个个的Es实例Node
构成,每个Es实例中存放着一个个的彩色方块(Shard
),同一个集群中相同颜色的方块(shard
)构成一个索引(index)
索引和分片、副本
实际上,索引更像是一个抽象的虚拟概念,使用时,我们面向的是索引(Index),只需要指定索引名即可。索引背后真正的实体是分片(Shard)。
同一集群中,同一索引(Index)可能由多个分片(Shard)组成,这些Shard会分布在不同的节点(Node)中;
而副本(Replication)则可以理解为一种特殊的分片,实际上数据是在一个个的分片上的,而副本的主要职责是对分片进行备份,以满足Es的稳定性。当副本数设置为1时,则代表着每个分片都会有一个副本,且副本中的内容与分片一样,肩负数据备份以及维稳责任。
例如我们在2个节点的集群上创建一个名为user的索引和student索引,user索引设置2个分片1个副本,student索引设置1个分片1个副本;那么user索引的两个shard会各自得到一个副本,副本和shard的内容一致,且均匀的分布在两个节点上(Es会根据相应的策略来尽可能保证分片和相应的副本不在同一节点中,且保证每个节点的数据都是完整的)。这样如果当Node1节点崩坏,对于user索引的查询,会由节点2的 shard1和shard0的副本来承担,且shard1和shard0的副本的数据之和是一个完整user的数据(等同于shard0和shard1)。
Segment
所以对于es来说,分片(shard)才是数据真正的载体,每一个Shard本质上是一个Lucene的索引(Lucene Index
)。
每个Lucene Index(Es的Shard)
是由多个Segment构成 ,Segement才是Lucene和Es查询性能的核心,Segment主要承载三部分内容:
-
Inverted Index
-
Stored Fields
-
Document Values
这些数据结构或机制,会保证在检索时,均衡合理使用内存和IO,让检索变得更高效
Inverted Index(倒排索引)
Segment中最重要的就是倒排索引,也是Es能够快速检索的根本,它是Segment基于存储的数据抽离出来的一个能够快速检索的数据结构,一个倒排索引的结构主要由一个有序的数据字典Dictionary(包括单词Term和它出现的频率)和 单词Term对应的Postings(文档的id或位置)组成:
对于倒排索引,Es中是根据字段不同类型进行不同的策略:
-
Text 字段:
- 这些字段用于全文搜索。
- 它们会被分析(分词),并创建倒排索引。
- 可以包含多个词项,支持全文搜索和复杂查询。
-
Keyword 字段:
- 这些字段用于结构化搜索,如过滤、排序、聚合。
- 它们不会被分析,而是以整个字段的值存储。
- 每个不同的字段值都会在倒排索引中拥有一个独立的条目。
-
Numeric 字段(如 in