天天看点

Elastic search基础

1.es存储的基本单位

​ es存储的基本单位是索引。

// ES
index -> type -> mapping -> document -> field

//MySQL or PostgreSQL
database -> table -> table structure -> data -> table field
           

这里将ES的基本术语和数据库做了一个关联,仅个人学习时的理解。

2.es的基本架构设计

​ 一个index(索引)会被分割成多个shard(分片),每个shard都存储了该index下的部分数据。这样存储有2个好处。支持横向扩展,只需要将shard数量增加即可;性能较高,所有的查询操作都会在多个机器上运行,提升了稳定性。

Elastic search基础

​ 每个shard是有多个备份的。有主分片(primary shard)和副本分片(replica shard),主分片用来执行写操作,副本分片在主分片写入完成之后同步其数据。如果某个机器停机了,其他分片的数据还是完整的。

​ es 集群多个节点,会自动选举一个节点为 master 节点,这个 master 节点其实就是干一些管理的工作的,比如维护索引元数据、负责切换 primary shard 和 replica shard 身份等。

​ master 节点宕机了,那么会重新选举一个节点为 master 节点。

​ 非 master节点宕机了,那么会由 master 节点,让那个宕机节点上的 primary shard 的身份转移到其他机器上的 replica shard。接着你要是修复了那个宕机机器,重启了之后,master 节点会控制将缺失的 replica shard 分配过去,同步后续修改的数据之类的,让集群恢复正常。

3.es读写数据的基本原理

写数据

1.客户端选择一个协调节点(coordinating node)发送请求;

2.由coordinating node对document进行路由,将请求转发给对应的primary shard node

3.执行写操作,同时同步数据至replica shard node

4.主从节点都写入完成后,响应给客户端。

Elastic search基础

写数据底层原理

**注:**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磁盘文件中。

Elastic search基础

读数据

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写入磁盘,同时替换掉之前的文件。

4.什么是倒排索引

在搜索引擎中,每个文档都有一个对应的文档 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 Facebook 1,2,3,4,5
6 加盟 2,3,5
7 创始人 3
8 拉斯 3,5
9 离开 3
10 4

另外,实用的倒排索引还可以记录更多的信息,比如文档频率信息,表示在文档集合中有多少个文档包含某个单词。

那么,有了倒排索引,搜索引擎可以很方便地响应用户的查询。比如用户输入查询

Facebook

,搜索系统查找倒排索引,从中读出包含这个单词的文档,这些文档就是提供给用户展示的搜索结果。

要注意倒排索引的两个重要细节:

  • 倒排索引中的所有词项对应一个或多个文档;
  • 倒排索引中的词项根据字典顺序升序排列

继续阅读