文章的目录是什么是ES? ES的查询语法详细说明了ElasticSearch索引文档的进程ElasticSearch是如何实现Master选举的。 获取分片id的算法ES的群集、节点、索引、文档和类型是什么? ES写入数据流ES读取数据流ES检索数据流程ES大数据量聚合如何实现删除和更新原理merge操作,请参考分段合并基础lucene反向索引Translog详细内容
ES是什么?
es是一个基于lucene的搜索引擎,提供具有Http Web界面和JSON文档的分布式全文搜索引擎。
ES的查询语法ES主要使用两种查询语法。
Lucene查询语法根据json的DSL查询语法,详细了解ElasticSearch为文档编制索引的流程协调节点默认使用文档ID参与计算,以提供适合路由的分片
当平铺所在的节点接收到协调节点的请求时,请求将写入内存缓冲器,并定期写入文件系统缓存。 此内存缓冲器到文件系统缓存的过程为refresh
在某些情况下,内存缓冲器和文件系统缓存所在的数据可能会丢失。 es通过translog机制保证数据的可靠性。 其实现原理在收到请求后同时写入translog,并在文件系统缓存数据写入磁盘时清除。 将此过程转换为flush
在闪存期间,内存中的缓存将被清除,内存将写入新段。 段的fsync创建新的提交点,将内容刷新到磁盘,删除旧的事务日志,并启动新的事务日志。
flush触发器的计时为计时器触发器(默认30分钟)或translog太大(如果太大) (默认为512M )。
ElasticSearch是如何实现Master选举的? ES选主由ZenDiscovery负责,主要包括Ping和Unicast来实现
对于能够成为主节点的所有节点,在nodeId字段中进行排序,每次选出各节点时依次拍摄自己知道的节点,选出第一个节点,暂且作为主节点
如果对某个节点的投票数达到一定的值(可能成为主节点数n/2 1 ),且该节点自身也选择了自己,则该节点是主节点。 否则,将进行重新选举,直到满足上述条件。
主节点的作用主要是管理群集、节点和索引
获取分片id的算法分片id由路由算法获取。 路由算法是根据路由和文档id计算目标id的过程
shard=hash (文档_ id ) ) % (number_of_primary_shards ) ) ) ) ) ) ) ) )。
ESS的集群、节点、索引、文档和类型是什么?集群是一个或多个节点的集合,可将数据一起存储,并提供跨所有节点的索引和搜索功能。 群集由唯一的名称标识,默认为" elasticsearch "。 如果节点被配置为按名称加入群集,则该名称很重要,因为该节点只是群集的一部分。
对于节点,是群集一部分的单个服务器。 他保存数据,并参与集群的索引和检索功能
索引:就像关系数据库中的数据库。 他定义了多种类型的映射。 索引是逻辑命名空间,映射到一个或多个主片,并且可以有一个或多个副本片
分片:索引通常划分为分布在多个节点上的分片
副本:副本是瓷砖的副本,
文档:类似于数据库中的一行
类型是索引的逻辑分区/类别
33558www.Sina.com/:1:一个索引可以包含多段。 线段和线段是独立的,添加新文档会生成新的线段,并将不同的线段合并在一起。 段是索引数据存储的设备“
33558www.Sina.com/:1:一个文档可以包含多个列,是lucene数据索引的最小定义单位
段segment是检索语法的最小单位,复杂的检索语法分解为一个Term查询,他表示文档的一个词,Term由两部分组成,它所表示的词和出现这个词的Field。
ES数据写入进程客户端通过协调节点(coordinatingnode,coordinatingnode )协调节点路由文档, 选择将请求转发到对应主节点(primaryshard,主共享)的实际节点上的主共享节点的节点,发送请求,然后将数据与复制节点编码节点同步。 如果知道主节点和所有replica node都已完成,则返回响应结果并将数据读取到客户机ES的过程可以通过doc id进行检查,并根据doc id进行散列,然后将doc id分配给哪个shard
p> 客户端发送请求到任意一个node,称为coordinating nodecoordinating node对doc id进行hash路由,将请求发送到对应的节点,此时会使用round-robin随机轮询算法,在primary shard以及所有的replica中随机选取一个,让读请求负载均衡接收请求的node返回document给coordinating nodecoordinating node返回document给客户端写请求是写入primary shard,然后同步给所有的replica shard;读请求可以从primary shard或replica shard读取,采用的是随机轮询算法。
ES搜索数据的过程Query Then Fetch:先获取文档ID,在获取数据
客户端发送请求到coordinating node协调节点将搜索请求转发到所有的shard对应的primary shard或replica shardquery 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