问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ElasticSearch查询流程详解

发布网友 发布时间:2022-10-13 16:41

我来回答

1个回答

热心网友 时间:2023-11-06 07:34

前面已经介绍了ElasticSearch的写入流程,了解了ElasticSearch写入时的分布式特性的相关原理。ElasticSearch作为一款具有强大搜索功能的存储引擎,它的读取是什么样的呢?读取相比写入简单的多,但是在使用过程中有哪些需要我们注意的呢?本篇文章会进行详细的分析。

在前面的文章我们已经知道ElasticSearch的读取分为两种GET和SEARCH。这两种操作是有一定的差异的,下面我们先对这两种核心的数据读取方式进行一一分析。

(图片来自官网)

以下是从主分片或者副本分片检索文档的步骤顺序:

注意:

在协调节点有个http_server_worker线程池。收到读请求后它的具体过程为:

数据节点上有一个get线程池。收到了请求后,处理过程为:

注意:

get过程会加读锁。处理realtime选项,如果为true,则先判断是否有数据可以刷盘,然后调用Searcher进行读取。Searcher是对IndexSearcher的封装在早期realtime为true则会从tranlog中读取,后面只会从index的lucene读取了。即实时的数据只在lucene之中。

对于Search类请求,ElasticSearch请求是查询lucene的Segment,前面的写入详情流程也分析了,新增的文档会定时的refresh到磁盘中,所以搜索是属于近实时的。而且因为没有文档id,你不知道你要检索的文档在哪个分配上,需要将索引的所有的分片都去搜索下,然后汇总。ElasticSearch的search一般有两个搜索类型

所有的搜索系统一般都是两阶段查询:

第一阶段查询到匹配的docID,第二阶段再查询DocID对应的完整文档。这种在ElasticSearch中称为query_then_fetch,另一种就是一阶段查询的时候就返回完整Doc,在ElasticSearch中叫query_and_fetch,一般第二种适用于只需要查询一个Shard的请求。因为这种一次请求就能将数据请求到,减少交互次数,二阶段的原因是需要多个分片聚合汇总,如果数据量太大那么会影响网络传输效率,所以第一阶段会先返回id。

除了上述的这两种查询外,还有一种三阶段查询的情况。

搜索里面有一种算分逻辑是根据TF和DF来计算score的,而在普通的查询中,第一阶段去每个Shard中独立查询时携带条件算分都是独立的,即Shard中的TF和DF也是独立的。虽然从统计学的基础上数据量多的情况下,每一个分片的TF和DF在整体上会趋向于准确。但是总会有情况导致局部的TF和DF不准的情况出现。

ElasticSearch为了解决这个问题引入了DFS查询。

比如DFS_query_then_fetch,它在每次查询时会先收集所有Shard中的TF和DF值,然后将这些值带入请求中,再次执行query_then_fetch,这样算分的时候TF和DF就是准确的,类似的有DFS_query_and_fetch。这种查询的优势是算分更加精准,但是效率会变差。

另一种选择是用BM25代替TF/DF模型。

在ElasticSearch7.x,用户没法指定以下两种方式:DFS_query_and_fetchquery_and_fetch

注:这两种算分的算法模型在《ElasticSearch实战篇》有介绍:

这里query_then_fetch具体的搜索的流程图如下:

(图片来自官网)

查询阶段包含以下四个步骤:

以上就是ElasticSearch的search的详细流程,下面会对每一步进行进一步的说明。

协调节点处理query请求的线程池为:

http_server_work

负责该解析功能的类为:

org.elasticsearch.rest.action.search.RestSearchAction

主要将restquest的参数封装成SearchRequest

这样SearchRequest请求发送给TransportSearchAction处理

将索引涉及到的shard列表或者有跨集群访问相关的shard列表合并

如果有多个分片位于同一个节点,仍然会发送多次请求

shardsIts为搜索涉及的所有分片,而shardRoutings.nextOrNull()会从分片的所有副本分片选出一个分片来请求。

onShardSuccess对收集到的结果进行合并,这里需要检查所有的请求是否都已经有了回复。

然后才会判断要不要进行executeNextPhase

当返回结果的分片数等于预期的总分片数时,协调节点会进入当前Phase的结束处理,启动下一个阶段Fetch Phase的执行。onPhaseDone()会executeNextPhase来执行下一个阶段。

当触发了executeNextPhase方法将触发fetch阶段

上一步的executeNextPhase方法触发Fetch阶段,Fetch阶段的起点为FetchSearchPhase#innerRun函数,从查询阶段的shard列表中遍历,跳过查询结果为空的 shard。其中也会封装一些分页信息的数据。

使用了countDown多线程工具,fetchResults存储某个分片的结果,每收到一个shard的数据就countDoun一下,当都完毕后,触发finishPhase。接着会进行下一步:

CountedCollector:

finishPhase:

执行字段折叠功能,有兴趣可以研究下。即ExpandSearchPhase模块。ES 5.3版本以后支持的Field Collapsing查询。通过该类查询可以轻松实现按Field值进行分类,每个分类获取排名前N的文档。如在菜单行为日志中按菜单名称(用户管理、角色管理等)分类,获取每个菜单排名点击数前十的员工。用户也可以按Field进行Aggregation实现类似功能,但Field Collapsing会更易用、高效。

ExpandSearchPhase执行完了,就返回给客户端结果了。

处理数据节点请求的线程池为:search

根据前面的两个阶段,数据节点主要处理协调节点的两类请求:query和fetch

这里响应的请求就是第一阶段的query请求

executeQueryPhase:

executeQueryPhase会执行loadOrExecuteQueryPhase方法

这里判断是否从缓存查询,默认启用缓存,缓存的算法默认为LRU,即删除最近最少使用的数据。如果不启用缓存则会执行queryPhase.execute(context);底层调用lucene进行检索,并且进行聚合。

关键点:

ElasticSearch查询分为两类,一类为GET,另一类为SEARCH。它们使用场景不同。

本文主要分析了ElasticSearch分布式查询主体流程,并未对lucene部分进行分析,有兴趣的可以自行查找相关资料。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
广东省考考哪3科 六个月宝宝缺铁吃什么好 疯狂动物园 大猩猩栖息地升级技巧 疯狂动物园怎么办boss任务 boss任务过法 疯狂动物园怎么驯服火山猩猩 疯狂动物园驯服火山猩猩 疯狂动物园火山猩猩 在陌生的城市如何辨别东南西北? 女羊男虎千万别在一起 女羊男虎婚配好不好 属羊女与属虎男婚姻能否长久 属羊女的和什么属相最配 Elasticsearch(3台master和3台data)配置文件详解 pthread_create ——我与华为线程的争斗 ThreadPoolExcutor用法详解 Spring Boot中异步线程池@Async详解 求凯莉小说全集 促销商品英语怎么说啊 在平面地球仪上怎样辨别中午子夜等 我嫁给有钱老公,每个月有三万零花钱,可我就像是被囚禁了一样,怎么办? 北大陈静雯是哪一年的高考状元 苹果笔记本安装系统需要对照美国时间吗 重庆市南岸区融侨半岛云满庭C区 英文翻译,谢谢哪位仁兄帮忙 大学毕业季离别文案 汉中有没有通信管理局?拜托各位大神 教师节主题征文:我心目中的好老师? 我心中的好老师征文(小学组) 我心目中的老师话题作文 第33个教师节主题征文:我心目中的好老师? 教师节我心目中的好老师征文 教师节作文:我心目中的老师 大众新polo节气门怎么清洗,新polo节气门清洗方法 七年级数学上学期期中测试卷子与答案 七年级数学期中试卷 there are many snakes in Australia这个俚语什么意思,那位高手和我讲一下? 网络赌博银行卡被冻结里面的钱能拿出来吗 金融是一国的经济命脉吗 求一部BL漫画,攻是一只豹子,受是人。受在草原拍攻的照片,攻很难被拍到。一个月吧受想着这次总能拍到 二年级养蚕日记 孩子玩耍时总是变成“泥娃娃”,为何这类孩子如此偏爱玩泥呢? 孩子爱玩泥巴怎么办? 漳平市动物卫生监督所在哪里? 漳平金色华城在哪里 漳平凯源哪里有古筝琴行 Intel平台最好的整合主板是什么(显卡最好)? 步步惊心的女主角若曦的真是性名是什么? 《*荣誉》开播啦,这部剧的演员阵容如何?能否在*题材电视剧破圈呢? 凤梨和菠萝实则上就是一种水果中的不同品种,凤梨是不是菠萝? 狼的翻译及字词解释ppt 狼和小羊教学设计 喜欢赵丽颖的泰国明星 泰国娱乐圈中有没有中国籍明星,?如有,是谁?