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端)相关推荐

  1. elasticsearch源码分析之search模块(client端)

    elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们 ...

  2. Elasticsearch源码分析—线程池(十一) ——就是从队列里处理请求

    Elasticsearch源码分析-线程池(十一) 转自:https://www.felayman.com/articles/2017/11/10/1510291570687.html 线程池 每个节 ...

  3. 【投屏】Scrcpy源码分析四(最终章 - Server篇)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  4. FreeCAD源码分析:FreeCADGui模块

    FreeCAD源码分析:FreeCADGui模块 济南友泉软件有限公司 FreeCADGui项目实现了界面操作.模型显示与交互等相关功能,项目构建生成FreeCAD(_d).dll动态链接库. Fre ...

  5. Python3.5源码分析-内建模块builtins初始化

    Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3模块初始化与加载 Python的模块分为内建的模 ...

  6. dubbo源码分析系列——dubbo-cluster模块源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 模块功能介绍 该模块的使用介绍请参考dubbo官方用户手册如下章节内容. 集群容错 负载均衡 路由规则 配置规则 注册中心参考 ...

  7. 【转】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- ...

  8. LiteOS内核源码分析:位操作模块

    摘要:本文带领大家一起剖析了LiteOS位操作模块的源代码,代码非常简单,参考官方示例程序代码,实际编译运行一下,加深理解. 本文分享自华为云社区<LiteOS内核源码分析系列五 LiteOS内 ...

  9. Scrapy 源码分析之 RetryMiddleware 模块

    这是「进击的Coder」的第 689 篇技术分享 作者:TheWeiJun 来源:逆向与爬虫的故事 " 阅读本文大概需要 13 分钟. " 时隔一个多月,scrapy 章节又迎来了 ...

最新文章

  1. 基于单目摄像头的BEV实例预测(ICCV 2021)
  2. 一种缘于积木游戏的思维
  3. 阿里云 AI 编辑部获 CCBN 创新奖,揭秘传媒行业解决方案背后的黑科技
  4. Kali Linux 下渗透测试 | 3389 批量爆破神器 | hydra | 内网渗透测试
  5. html h1 字母,html----h1-6标签
  6. 工信部发布《区块链 数据格式规范》标准(PPT全文)
  7. SiteServer 迁移至 Windows 2008 R2 问题汇总
  8. linux下查看cpu信息
  9. HDU 1133 Buy the Ticket
  10. mybatis配置文件祥解(mybatis.xml)
  11. web前端对http理解
  12. 记一次LeetCode中文版打不开的情况
  13. java poc_spring系列cve poc编写
  14. 谈一谈我对本科计算机专业的认识
  15. 禁用win10自带的微软输入法!
  16. png转svg格式并上传至iconfont
  17. 流形学习(二) Isomap 在 MATLAB 中的实现及实例
  18. Image Denoising State-of-the-art
  19. 基于javaweb的校园外卖点餐系统(java+ssm+jsp+mysql)
  20. 全国产龙芯2K0500多功能SoC处理器及其解决方案

热门文章

  1. mysql 事务涉及锁吗_MySQL-锁机制和事务
  2. jquery 毫秒转换成日期_jQuery Datepicker – 如何将日期格式化为纪元时间戳(以秒为单位,而不是毫秒)...
  3. dnf拍卖行计算机在线,DNF助手拍卖行在哪里 拍卖行物价实时查询
  4. Java开发面试题,Java常用类使用总结
  5. 写得太好了!树莓派安装docker
  6. 【深度学习】基于Pytorch的softmax回归问题辨析和应用(二)
  7. 【深度学习】详解集成学习的投票和Stacking机制
  8. 【操作系统】考研の处理机调度算法(看不懂你来打我~!)
  9. python【力扣LeetCode算法题库】21- 合并两个有序链表
  10. 红曲面怎么做_「曲面建模」CREO陶瓷小摆件的曲面建模,怎么样分析和拆解面...