概念

document(文档)

包含数据的 JSON 对象。可以理解为数据库(database)里的行(row)。

不需要提前定义 index(document) 里字段结构,也不要求所有 document 结构相同。

index(indices,索引)

JSON 格式的 document 集合。可以理解为数据库里的表(table)。

field(字段)

document 里的 Key-value 结构。可以理解为数据库的列(column)。

字段有很多类型(field type),其中 text 存在倒排索引里,数字(numeric)和经纬度(geo)存在 BKD Tree。

不能修改已经存在的 field 类型。


特别说明下 text 字段和 keyword 字段的区别。

text : 支持分词,全文检索,模糊、精确查找,不支持聚合、排序。场景:邮件内容。

keyword : 不分词,直接索引,模糊、精确查找,支持聚合、排序操作。场景:邮箱号码。

mapping(映射)

可以理解为数据库里的 schemas 。定义 document 、field 属性,如何存储、分词、索引等。

shard(分片)

一个 shard 是一个 lucene 索引(Lucene 索引是由 segment 构成)。index 数据存储在一个或多个 shard 里,即 index 由 shard 构成。

较大的 shard,官方建议最佳分片大小是 10G ~ 50G。shard 有 primary shard 和 replica shard 两种类型。

ElasticSearch 性能调优提到 shard 控制在 10G 左右性能有明显提升。

primary shard(主分片)

index 里每个 document 都属于一个 primary shard。个数在创建时确定,后续不能改(跟路由有关)。

replica shard(副本分片)

可以随时修改个数。为了保证容灾,每个 replica 必须在不同的 node 上,一般 1~3 个。

除了用来备份数据,还可以用来提高系统读的吞吐率。也就是读写分离。

node(节点)

Elasticsearch 实例。所有节点都知道其他节点的存在,并且能分发客户端请求到合适的 node。

node 有不同的角色,一个 node 可以同时有多种角色。

data node(数据节点)

存数据,负责执行 CRUD、搜索和聚合。根据数据使用情况,还可以进一步细分为 hot、warm、cold、frozen角色。

master node(有投票权节点)

有资格被选为主节点的 node,还不是真正的主节点。

elected-master node(主节点)

被选举出来的真正主节点,负责维护集群信息(cluster state)和分配 shard。

ingest node(摄取节点)

用来做预处理。

coordinating node(协调节点)

所有节点默认是 coordinating node,并且不可关闭。该节点作为负载路由器,将传入的请求路由到集群中的不同节点。

coordinating node 节点处理客户端的请求一般分为两个阶段,第一节点,收到客户端的请求并路由到合适的分片(包含请求数据的主分片),第二阶段对结果做聚合。

cluster(集群)

由连接的 nodes 构成。同一个集群通常在同一个网络内。集群可以组成更大的集群网CCR

inverted index(倒排索引)

Lucene 用来做全文检索的数据结构。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。

segment(段)

Lucene 里的数据文件,类似于倒排索引,是内部存储单元,用来存索引数据。不可修改。

更新 document 时,产生新 segment,并把老的标记为删除,segment merge 时才真正删掉。

translog(transaction log 事务日志)

提供所有还没有被刷到磁盘的操作的一个持久化纪录。

index.translog.durability,默认 request,表示主分片和每个副本都完成 translog 刷盘和提交;

async,定时刷盘和提交,间隔 index.translog.sync_interval,默认 5s,不能少于 100ms。

参考链接:

  1. Elasticsearch 7.X 术语表
  2. Translog 简介