文章目录
什么是ES?
es是基于lucene的搜索引擎, 它提供了具有Http Web界面和JSON文档的分布式的全文搜索引擎。
ES中查询语法
es主要使用两种类型的查询语法:
- Lucene查询语法
- 基于json的DSL查询语法
详细描述一下ElasticSearch索引文档的过程
协调节点默认使用文档ID参与计算,以便为路由提供合适的分片。
当分片所在的节点接收到来自协调节点的请求后,会将请求写入Memory Buffer,然后定时写入到Filesystem Cache。这个从Memory Buffer到Filesystem Cache的过程就叫做refresh。
在某些情况下,存在Memory Buffer和Filesystem Cache的数据可能会丢失,ES是通过translog的机制来保证数据的可靠性的。其实现原理是接收到请求后,同时也会写入到translog中,当Filesystem cache的数据写入到磁盘中时,才会清除掉,这个过程叫做flush。
在flush过程中,内存中的缓存将会清除,内存被写入一个新段,段的fsync将创建一个新的提交点,并将内容刷入磁盘,旧的translog将被删除,并开始一个新的translog。
flush触发的时机是定时触发(默认30分钟)或者translog变得太大(默认为512M)时。
ElasticSearch是如何实现Master选举的?
ES选主是通过ZenDiscovery负责的,主要包含Ping和Unicast来实现
对于所有可以成为master的节点,根据nodeId字段排序,每次选举每个节点都把自己所知道的节点拍一次序,然后选出第一个节点,暂且作为master节点
如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己,那这个节点就是master。否则重新选举一直到满足上述条件。
master节点的职责主要包括:集群、节点和索引的管理
获取分片id的算法
分片id借助路由算法获取。路由算法就是根据路由和文档id计算目标id的过程
shard = hash(document_id) % (number_of_primary_shards)
ES中的集群、节点、索引、文档、类型是什么?
集群是一个或多个节点的集合,他们共同保存数据,并提供跨所有节点的联合索引和搜索功能。群集由唯一名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分。
节点时属于集群一部分的单个服务器。他存储数据并参与集群的索引和搜索功能
索引:就像关系数据库中的数据库。他有一个定义多种类型的映射。索引是逻辑名称空间,映射到一个或多个主分片,并且可以拥有一个或多个副本分片
分片:索引通常被分割成分布在多个节点上的分片
副本:副本是分片的副本,
文档:类似数据库中的一行
类型是索引的逻辑分区/类别
段segment:一个索引可以包含多个段,段与段之间是独立的,添加新文档可以生成新的段,不同的段可以合并。段是索引数据存储的单元‘
字段field:一个文档可以包含多个列,是lucene数据索引的最小定义单位
Term是搜索语法的最小单位,复杂的搜索语法会分解成一个Term查询,他表示文档的一个词语,Term由两部分组成:它表示的词语和这个词语所出现的Field。
ES写数据流程
- 客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)
- coordinating node对document进行路由,将请求转发到对应的node(由primary shard)
- 实际的node上的primary shard处理请求,然后将数据同步到replica node
- coordinating node如果发现primary node和所有的replica node都搞定之后,就返回响应结果给客户端
ES读数据流程
可以通过doc id来查询,会根据doc id进行hash,判断出来当时把doc id分配到了哪个shard上去,从那个shard去查询。
- 客户端发送请求到任意一个node,称为coordinating node
- coordinating node对doc id进行hash路由,将请求发送到对应的节点,此时会使用round-robin随机轮询算法,在primary shard以及所有的replica中随机选取一个,让读请求负载均衡
- 接收请求的node返回document给coordinating node
- coordinating node返回document给客户端
写请求是写入primary shard,然后同步给所有的replica shard;读请求可以从primary shard或replica shard读取,采用的是随机轮询算法。
ES搜索数据的过程
Query Then Fetch:先获取文档ID,在获取数据
- 客户端发送请求到coordinating node
- 协调节点将搜索请求转发到所有的shard对应的primary shard或replica shard
- query phase:每个shard将自己的搜索结果返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,最终产出结果
- fetch phase:由协调节点根据doc id去各个节点上拉取实际的document数据,最终返回给客户端
ES对于大数据量的聚合如何实现
提供了近似聚合cardinality度量,
其特点是:可配置的精度,用来控制内存的使用(更精确 = 更多内存);小的数据集精度是非常高的;我们可以通过配置参数,来设置去重需要的固定内存使用量。无论数千还是数十亿的唯一值,内存使用量只与你配置的精确度相关
删除和更新原理
一个文档被删除时,它实际上只是在.del文件中被标记删除。一个被标记删除的文档仍然可以被查询到,但是会在返回前从结果集中移除。
文档更新也是类似的操作:文档被更新时,旧版本文档被标记删除,文档的新版本被索引到新的断中
端合并时会将旧的已删除文档从文件系统中清楚。被删除的文档不会被拷贝到新的段中
merge操作,段合并
由于每秒会把buffer刷到segment中,所以segment会很多,为了防止这种情况,es内部会不断的把相似大小的segment合并,并且物理删除del的segment
底层lucene
简单来说,lucene就是一个jar包,里面包含了封装好的各种建立倒排索引的算法代码。用java开始时,引入lucene的jar,然后基于lucene的api去开发就可以了
倒排索引
在搜索引擎中,每个文档都有一个对应的文档ID,文档内容表示为一系列关键字的集合。例如,文档经过一次分词,提取了20个关键字,每个关键字都会记录它在文档中出现的次数和位置
倒排索引就是关键字到文档id的映射,每个关键字都对应着一系列的文件,这些文件中都出现了关键字
有了倒排索引,搜索引擎可以方便的响应用户的查询
倒排索引的两个重要细节:
- 倒排索引中的所有词项对应一个或多个文档
- 倒排索引中的词项根据字典顺序升序排列
Translog详解
translog是用来恢复数据的。ES用后写的套路加快写入速度——写入的索引并没有实时落盘到索引文件,而是双写到内存和translog中
参考
ElasticSearch面试必考 https://blog.youkuaiyun.com/abcd1101/article/details/89010070