elasticsearch源码分析之search模块(client端)
2017-07-25 11:00
525 查看
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
相关文章推荐
- elasticsearch源码分析之search模块(server端)
- RocketMQ client客户端模块源码分析一(生产者)
- Elasticsearch之client源码简要分析
- Elasticsearch之client源码简要分析
- adb 深入分析一1、adb模块的源码路径,源码编译生成的结果。 2、adb模块分为adb client、adb server、services、adbd daemon几个模块。 3、adb通讯模
- elasticsearch源码分析之search查询(十一)
- Elasticsearch之client源码简要分析
- Mangos源码分析(14):Mangos预编译头文件及模块划分随想
- mosquitto-0.15-client-pub_client.c源码分析
- 分布式搜索Elasticsearch源码分析之二------索引过程源码概要分析
- Nginx Upstream模块源码分析(上)
- jQuery源码分析系列:事件模块概述
- nginx源码分析——事件模块
- tomcat6源码分析一(核心模块分析)
- Redis源码剖析和注释(二十)--- 网络连接库剖析(client的创建/释放、命令接收/回复、Redis通信协议分析等)
- Android FM模块学习之四源码分析(3)
- Hadoop2源码分析-HDFS核心模块分析
- Pig源码分析: 逻辑执行计划模块
- 【转】Spark源码分析之-scheduler模块
- npm模块corn源码分析