elasticsearch源码分析之search模块(server端)
elasticsearch源码分析之search模块(server端)
继续接着上一篇的来说啊,当client端将search的请求发送到某一个node之后,剩下的事情就是server端来处理了,具体包括哪些步骤呢?
过程
一、首先我们来看看接收地方其实就是在org.elasticsearch.action.search.TransportSearchAction
中,收到请求之后会判断请求的index的shard是否只有一个,如果是一个的话,那么会强制将请求的type设置为QUERY_AND_FETCH
,因为所以的事情在此shard上就能够做完了。所以如果设置了routing,而让请求落在了一个shard上时,搜索的效率会高很多的原因。
二、根据不同的type来确定不同的处理方式,这里补充一下,上一篇可能忘记说了,search的type一般来说分为“DFS_QUERY_THEN_FETCH、QUERY_THEN_FETCH、DFS_QUERY_AND_FETCH、QUERY_AND_FETCH”这四种,还有“SCAN、COUNT”在ES2.X里面其实已经被舍弃掉了。我们一般都是用的默认的QUERY_THEN_FETCH,上面说的一个shard的除外。所以本篇就只讨论这种情况了。
三、得到搜索的index所涉及的shard,并依次执行: 1、获取该shard所在的node并执行sendExecuteFirstPhase
,实际上是向node发送了一个“QUERY”的请求:
transportService.sendRequest(node, QUERY_ACTION_NAME, request, new ActionListenerResponseHandler<QuerySearchResultProvider>(listener) { @Override public QuerySearchResult newInstance() { return new QuerySearchResult(); } });
2、node接收到"QUERY"的请求之后,执行executeQueryPhase
:首先是创建一个search的context,
SearchContext context = new DefaultSearchContext(idGenerator.incrementAndGet(), request, shardTarget, engineSearcher, indexService, indexShard, scriptService, pageCacheRecycler, bigArrays, threadPool.estimatedTimeInMillisCounter(), parseFieldMatcher, defaultSearchTimeout);
创建的具体过程就不详细说了,之后做的事情还是有parseSource、对size做判断(2.X里面最大不超过10000,可以通过配置文件配置)、……
最重要的其实是loadOrExecuteQueryPhase(request, context, queryPhase);
,具体的内容是首先从cache里面执行query,如果cache里面没有找到,才会执行queryPhase:queryPhase.execute(context);
;里面的处理逻辑就比较复杂了,但是最重要的是searcher.search(query, collector);
,其实是调用了Lucene里面IndexSeartcher
的search方法。
3、如此一来,第一阶段的query已经做完了,,接下来便是fetch的执行,入口在onFirstPhaseResult
这里,在底层同样是向node发送一个“FETCH”请求咯:
4、node接收到“fetch”请求之后,执行executeFetchPhase
:
fetch的核心代码如下:
。。。
大意就是轮流通过之前query结果中的docid,然后创建出InternalSearchHit
的集合,并将之放在fetchResult中context.fetchResult().hits(new InternalSearchHits(hits, context.queryResult().topDocs().totalHits, context.queryResult().topDocs().getMaxScore()));
,并将之返回到发送fetch的node。
四、到目前为止,该获取的数据都已经拿到了,现在要做的则是要把个node的返回结果做merge,merge的操作由SearchPhaseController
来控制:
final InternalSearchResponse internalResponse = searchPhaseController.merge(sortedShardList, firstResults, fetchResults, request);
具体的过程就不细说了,大体就是该排序的就做排序,有aggs的就做aggs……
五、通过listener将上面的结果返回:listener.onResponse(new SearchResponse(internalResponse, scrollId, expectedSuccessfulOps, successfulOps.get(), buildTookInMillis(), buildShardFailures()));
给发出接收search请求的node,也就是上一篇说道的client。
总结
这样知道了,为什么返回的结果长那么个鬼样子了。整个过程的话算是走马观花地走了一遍了,其实里面还有很多detail的东西没用讲到,看一张图就知道了:
包括他们分别的具体实现什么的,所以一个查询牵扯到的东西实在太多,等有时间再去深究,可都是财富。
转载请注明出处:http://www.opscoder.info/es_search_server.html
转载于:https://www.cnblogs.com/bonelee/p/7233035.html
elasticsearch源码分析之search模块(server端)相关推荐
- elasticsearch源码分析之search模块(client端)
elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们 ...
- Elasticsearch源码分析—线程池(十一) ——就是从队列里处理请求
Elasticsearch源码分析-线程池(十一) 转自:https://www.felayman.com/articles/2017/11/10/1510291570687.html 线程池 每个节 ...
- 【投屏】Scrcpy源码分析四(最终章 - Server篇)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- FreeCAD源码分析:FreeCADGui模块
FreeCAD源码分析:FreeCADGui模块 济南友泉软件有限公司 FreeCADGui项目实现了界面操作.模型显示与交互等相关功能,项目构建生成FreeCAD(_d).dll动态链接库. Fre ...
- Python3.5源码分析-内建模块builtins初始化
Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3模块初始化与加载 Python的模块分为内建的模 ...
- dubbo源码分析系列——dubbo-cluster模块源码分析
2019独角兽企业重金招聘Python工程师标准>>> 模块功能介绍 该模块的使用介绍请参考dubbo官方用户手册如下章节内容. 集群容错 负载均衡 路由规则 配置规则 注册中心参考 ...
- 【转】Spark源码分析之-scheduler模块
原文地址:http://jerryshao.me/architecture/2013/04/21/Spark%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B- ...
- LiteOS内核源码分析:位操作模块
摘要:本文带领大家一起剖析了LiteOS位操作模块的源代码,代码非常简单,参考官方示例程序代码,实际编译运行一下,加深理解. 本文分享自华为云社区<LiteOS内核源码分析系列五 LiteOS内 ...
- Scrapy 源码分析之 RetryMiddleware 模块
这是「进击的Coder」的第 689 篇技术分享 作者:TheWeiJun 来源:逆向与爬虫的故事 " 阅读本文大概需要 13 分钟. " 时隔一个多月,scrapy 章节又迎来了 ...
最新文章
- 基于单目摄像头的BEV实例预测(ICCV 2021)
- 一种缘于积木游戏的思维
- 阿里云 AI 编辑部获 CCBN 创新奖,揭秘传媒行业解决方案背后的黑科技
- Kali Linux 下渗透测试 | 3389 批量爆破神器 | hydra | 内网渗透测试
- html h1 字母,html----h1-6标签
- 工信部发布《区块链 数据格式规范》标准(PPT全文)
- SiteServer 迁移至 Windows 2008 R2 问题汇总
- linux下查看cpu信息
- HDU 1133 Buy the Ticket
- mybatis配置文件祥解(mybatis.xml)
- web前端对http理解
- 记一次LeetCode中文版打不开的情况
- java poc_spring系列cve poc编写
- 谈一谈我对本科计算机专业的认识
- 禁用win10自带的微软输入法!
- png转svg格式并上传至iconfont
- 流形学习(二) Isomap 在 MATLAB 中的实现及实例
- Image Denoising State-of-the-art
- 基于javaweb的校园外卖点餐系统(java+ssm+jsp+mysql)
- 全国产龙芯2K0500多功能SoC处理器及其解决方案
热门文章
- mysql 事务涉及锁吗_MySQL-锁机制和事务
- jquery 毫秒转换成日期_jQuery Datepicker – 如何将日期格式化为纪元时间戳(以秒为单位,而不是毫秒)...
- dnf拍卖行计算机在线,DNF助手拍卖行在哪里 拍卖行物价实时查询
- Java开发面试题,Java常用类使用总结
- 写得太好了!树莓派安装docker
- 【深度学习】基于Pytorch的softmax回归问题辨析和应用(二)
- 【深度学习】详解集成学习的投票和Stacking机制
- 【操作系统】考研の处理机调度算法(看不懂你来打我~!)
- python【力扣LeetCode算法题库】21- 合并两个有序链表
- 红曲面怎么做_「曲面建模」CREO陶瓷小摆件的曲面建模,怎么样分析和拆解面...