ElasticSearch面试题

什么是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.csdn.net/abcd1101/article/details/89010070

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值