ElasticSearch(二)ElasticSearch的工作原理,
ElasticSearch创建索引/写入数据的原理
ElasticSearch查询索引的原理
查询ES数据需要两个步骤,第一个是查询阶段,所谓的查询阶段就是查询文件的轻量级结果返回给协调节点,然后协调节点统一排序,然后在进入真正获取文档阶段。第二是获取阶段,所谓的过获取阶段就是经过协调节点的排序,确立的文档的优先级,去分片中真正获取文档的过程。
查询阶段,当我们向ES集群发送请求的时候,一定会有一个节点接收到这个请求,那么接受到请求的这个节点就会成为一个协调节点,协调节点会根据路由算法,将请求转发到所以对应的所有分片上,分片独立执行搜索,并根据相关性分数创建一个优先级队列,然后所有分片将轻量级结果返回给协调节点,这个结果包含文档的Id和进行排序所需的信息,然后协调节点接收到所有分片返回来的结果,对文档进行全局的排序,目前为止查询阶段已经完成。
获取阶段,协调节点对文档进行全局排序过后,生成全局文档列表,他会从所有分片中请求原始的文档,所以分片会继续丰富文档,返回给协调节点,协调节点会将数据返回给客户端。
ElasticSearch更新删除索引的原理
在ElasticSearch中文档是不可改变的,所以呢更新索引和删除索引也是写操作,也就是不在原来的索引上做改动。
ElasticSearch中,每一个segment都会对应一个.del文件,当我们请求删除一个文档的时候,文档并没有被真是的删除,而是在.del中被标记为删除,但是这个文档还是可以被索引到的,只不过是将它在搜索结果中过滤掉了。当触发segment合并的时候,被标记为删除的segment文件不会合并的新的segment文件中,这样该文档就会彻底删除了。
更新文档的时候也是如此,当一个文档被插入的时候,ES会自动给他生成一个版本号,当对文档更新的时候,旧的版本的文档会被标记为删除,新文档会写入新的segment文件中,等到segment刷新到磁盘的时候,更新就完成了。
ElasticSearch路由原理
Shard分片
我们都是知道ElasticSearch是分布式的搜索引擎,那么它是怎么做到分布式的呢?那我们就需要引入一个Shard(分片)的概念,Shard(分片)又分为Primary Shard和Replic Shard。所谓的Shard(分片)就是存储数据的容器,当请求插入一条索引的时候,这个容器(Primary Shard)就已经创建好了,默认是5个,然后这些容器(Primary Shard)会均匀的散落在各个ES节点上。所以它的分布式原理就在这了。
Shared路由
当开始插入数据的时候,ES会根据路由算法计算请求的Document存入哪个容器(Primary Shard)中。具体的路由算法是hash(routing)%number_of_primary_shards。routing就是Document的_id,number_of_primary_shard就是Primary的分片数据量。例如一个Index有3个Primary Shard分别为P0,P1,P2。routing=1,然后hash(1)%3=0,那么Document就会被分到P0这个Shard上去。查询也是这个原理。