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

注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们可以简单地概括为将的数据请求发送到node,然后在对返回的结果做处理并返回给调用方,话虽如此,但是过程并非那么简单。

请求初始化

1、api的注册,上一篇已经提到了,所以的api都是通过Guice框架注册进来的,在注册的时候会在controller上将不同的url绑定到不同的handler中:

controller.registerHandler(GET, "/_search", this); controller.registerHandler(POST, "/_search", this); controller.registerHandler(GET, "/{index}/_search", this); controller.registerHandler(POST, "/{index}/_search", this); controller.registerHandler(GET, "/{index}/{type}/_search", this); controller.registerHandler(POST, "/{index}/{type}/_search", this); controller.registerHandler(GET, "/_search/template", this); controller.registerHandler(POST, "/_search/template", this); controller.registerHandler(GET, "/{index}/_search/template", this); controller.registerHandler(POST, "/{index}/_search/template", this); controller.registerHandler(GET, "/{index}/{type}/_search/template", this); controller.registerHandler(POST, "/{index}/{type}/_search/template", this); 

上述的url都属于search的范畴,

2、当接收到请求后,client端会parseSearchRequest,对于请求进行解析,解析结果用一个SearchRequest来表示,我们来看看包含哪些内容:

其他的不多说,特别地,对于source的解析是核心所在,由parseSearchSource来完成,返回一个SearchSourceBuilder,其主要包含:

private QuerySourceBuilder querySourceBuilder;private QueryBuilder postQueryBuilder; private BytesReference filterBinary;

其实就相当于分解动作了,所以的search不外乎都是由这些要素组成,主要包括query、filter、aggs等等。

请求的执行

1、接下来,client会将send request:client.search(searchRequest, new RestStatusToXContentListener<SearchResponse>(channel));,其中channel用于处理回调,返回的类型为SearchResponse

2、对应action的构建:

public void search(final SearchRequest request, final ActionListener<SearchResponse> listener) { execute(SearchAction.INSTANCE, request, listener); } 

其中SearchAction.INSTANCE就是一个search action的实例。listener监听回调。

3、用proxy来发送请求到server,上面的proxy其实是一个TransportProxyClient的实例,在Transport模块中其实已经说过了,请求都是由proxy的发送的:

protected <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder>> void doExecute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener<Response> listener) { proxy.execute(action, request, listener); } 

底层还是调用的TransportService的sendRequest,而发送到的node由DiscoveryNode node = nodes.get((index) % nodes.size());来决定,可以理解为轮训选取一个node(其实这里看到的和我之前的理解是有些大不一样了,我一直以为client端是直接发送给不同的shard所在的node上,再把结果合并起来的,难道之前理解是错的???)。

获取到从node返回的结果之后。由listener通过channel返回给调用方。

总结

client端的工作大体就是这么些了,下一遍再来说说在server端的工作了,server端的会比较麻烦一点,查询还会分query、fetch上面的,下一篇再见咯。

转载请注明出处:http://www.opscoder.info/es_search_client.html

转载于:https://www.cnblogs.com/bonelee/p/7232886.html

elasticsearch源码分析之search模块(client端)相关推荐

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

    elasticsearch源码分析之search模块(server端) 继续接着上一篇的来说啊,当client端将search的请求发送到某一个node之后,剩下的事情就是server端来处理了,具体 ...

  2. tfs_client php,TFS 源码分析 写文件操作 Client端

    整个写文件的总体流程这里有介绍 主要分析了写文件时,NameServer端的源码分析 这篇文章介绍写文件时,Client端的源码分析 本文描述的内容涉及TFS写入流程图中的step1, step2, ...

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

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

  4. FreeCAD源码分析:FreeCADGui模块

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

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

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

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

  7. Docker源码分析(二):Docker Client创建与命令执行

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part2 1. 前言 如今,Docker作为业界领先的轻量级虚拟化容器管理引 ...

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

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

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

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

最新文章

  1. git push 不再需要重复输入账户密码的技巧
  2. Leetcode 125. 验证回文串 解题思路及C++实现
  3. 汇编语言位向量(位映射)
  4. kafka批量启动脚本
  5. 背后的故事之 - 快乐的Lambda表达式(二)
  6. 使用el-checkbox实现全选,点击失效没有反应
  7. 十五、PHP框架Laravel学习笔记——构造器的 join 查询
  8. mysql 使用的三个小技巧
  9. Linux下informix的安装(最简单超详细)
  10. 昆仑通态触摸屏用串口与西门子200通讯,用网口做数据中转,把PLC数据转发给其他modbusTCP客户端
  11. 重要的表格数据误删了,用EasyRecovery快速恢复!
  12. 3.5mm音频插头的引脚连接关系
  13. 沈博研:你一定要看的黄金投资优势分析!
  14. 过滤器和拦截器(SpringMVC实现)
  15. WinForm DevExpress使用-(ChartControl控件绘制图表)
  16. Windows编译x264
  17. 教学中常用的计算机软件有哪些,信息技术教学中常用的教学方法有哪些
  18. android 著名播放器,【精华】十二大最著名的Android播放器开源项目
  19. python可视化——生成HTML文件
  20. 四旋翼无人机PID控制

热门文章

  1. 批处理下的 cd 与 cd /d 命令
  2. java2实用教程_Java2实用教程(第5版)重要点及遗漏点(二)
  3. mysql binlog 恢复 表_MySQL通过Binlog恢复删除的表
  4. 前端如何获取联通积分_怎么利用定制的小程序来获取流量
  5. 表情显示服务器异常,MySqlmoji表情引发的存储异常微信昵称
  6. linux openwrt插件,OpenWrt添加软件包(一)
  7. 基于Pytorch再次解读GoogLeNet现代卷积神经网络
  8. python【蓝桥杯vip练习题库】ADV-233 队列操作
  9. python【Matlibplot绘图库】画图种类(真の能看懂~!)
  10. 【Kali渗透全方位实战】Linux终端和基本Linux命令terminator