es存储的基本单位是索引。
// ES
index -> type -> mapping -> document -> field
//MySQL or PostgreSQL
database -> table -> table structure -> data -> table field
这里将ES的基本术语和数据库做了一个关联,仅个人学习时的理解。
一个index(索引)会被分割成多个shard(分片),每个shard都存储了该index下的部分数据。这样存储有2个好处。支持横向扩展,只需要将shard数量增加即可;性能较高,所有的查询操作都会在多个机器上运行,提升了稳定性。
每个shard是有多个备份的。有主分片(primary shard)和副本分片(replica shard),主分片用来执行写操作,副本分片在主分片写入完成之后同步其数据。如果某个机器停机了,其他分片的数据还是完整的。
es 集群多个节点,会自动选举一个节点为 master 节点,这个 master 节点其实就是干一些管理的工作的,比如维护索引元数据、负责切换 primary shard 和 replica shard 身份等。
master 节点宕机了,那么会重新选举一个节点为 master 节点。
非 master节点宕机了,那么会由 master 节点,让那个宕机节点上的 primary shard 的身份转移到其他机器上的 replica shard。接着你要是修复了那个宕机机器,重启了之后,master 节点会控制将缺失的 replica shard 分配过去,同步后续修改的数据之类的,让集群恢复正常。
1.客户端选择一个协调节点(coordinating node)发送请求;
2.由coordinating node对document进行路由,将请求转发给对应的primary shard node
3.执行写操作,同时同步数据至replica shard node
4.主从节点都写入完成后,响应给客户端。
**注:**es是准实时。默认是写入数据1秒之后才可以被看到,因为其默认1s执行一次refresh操作。
1.数据先写入buffer;
2.每隔1s刷新写入至os cache(数据进入到os cache就可以被搜索到);
3.每隔5s将os cache写入到translog文件中(如果机器在写入translog之前宕机,最多会丢失5秒的数据);
4.translog数据大到一定程度或者默认每隔30分钟,会触发一次commit操作,将缓冲区的数据都flush到segement file磁盘文件中。
1.发请求至任意一个coordinating node。
2.由coordinating node 对document id进行hash路由,将请求转发到对应的node上,会使用随机轮询算法在primary shard和replica shard中随机选一个,执行读操作。
3.接收所有node返回的document给 coordinating code,协调节点负责将数据进行合并、分页、排序等操作。
4.返回结果给客户端。
如果是删除操作,commit的时候会生成一个.del
文件,将doc标记为delete状态。在执行搜索时根据.del就可以判断出doc是否被删除。
如果是更新操作,会把之前的doc标记为delete状态,重新写入数据。
buffer每隔1秒进行refresh操作,则默认是每一秒生成一个segement file,当这个文件增加到一定程度,会触发merge操作,同时把.del文件删除,将新的segement file写入磁盘,同时替换掉之前的文件。
在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。
那么,倒排索引就是关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。
有以下文档:
DocId | Doc |
---|---|
1 | 谷歌地图之父跳槽 Facebook |
2 | 谷歌地图之父加盟 Facebook |
3 | 谷歌地图创始人拉斯离开谷歌加盟 Facebook |
4 | 谷歌地图之父跳槽 Facebook 与 Wave 项目取消有关 |
5 | 谷歌地图之父拉斯加盟社交网站 Facebook |
对文档进行分词之后,得到以下倒排索引(未进行严格的升序排列)。
WordId | Word | DocIds |
---|---|---|
1 | 谷歌 | 1,2,3,4,5 |
2 | 地图 | 1,2,3,4,5 |
3 | 之父 | 1,2,4,5 |
4 | 跳槽 | 1,4 |
5 | 1,2,3,4,5 | |
6 | 加盟 | 2,3,5 |
7 | 创始人 | 3 |
8 | 拉斯 | 3,5 |
9 | 离开 | 3 |
10 | 与 | 4 |
… | … | … |
另外,实用的倒排索引还可以记录更多的信息,比如文档频率信息,表示在文档集合中有多少个文档包含某个单词。
那么,有了倒排索引,搜索引擎可以很方便地响应用户的查询。比如用户输入查询 Facebook
,搜索系统查找倒排索引,从中读出包含这个单词的文档,这些文档就是提供给用户展示的搜索结果。
要注意倒排索引的两个重要细节: