
在es 中涉及到操作最多就是检索,接下来看看检索的源码是怎么个流程,在es Rest请求中我们看到了 **org.elasticsearch.rest.RestController#dispatchRequest(org.elasticsearch.rest.RestRequest, org.elasticsearch.rest.RestChannel, org.elasticsearch.rest.RestHandler) **这个方法 ,这是 es http 请求的总的一个控制器,
1 | private void dispatchRequest(RestRequest request, RestChannel channel, RestHandler handler) throws Exception { |
ctrl+alt+B 查看 handleRequest 实现类有哪些,这里有很多实现,但是大部分都是 test 可以看出都是测试用例,所以不是我们需要的,我们 需要看看其他的,可以猜 base 开头的 一般都是 基础实现 org.elasticsearch.rest.BaseRestHandler#handleRequest 当然有时候一次不一定正确。

这个方法代码都有注释,prepareRequest(request, client) 主要方法就是这个了,看看下面都有哪些实现。
1 |
|

这下面有239个实现,懵逼了有没有,这里我们需要查看RestSearchAction 类,这些类的命名让我们很容就和es的操作进行关联的。

查看如下方法org.elasticsearch.rest.action.search.RestSearchAction#prepareRequest
这里是返回的是一个 RestChannelConsumer 其实和 java.util.function.Consumer 一样的功能
1 |
|
类似 org.elasticsearch.action.ActionListener 类的使用方式 可以把监听和 源分离,看看例子
1 | static <Response> ActionListener<Response> wrap(CheckedConsumer<Response, ? extends Exception> onResponse, |
下面我主要看看 HttpChannelTaskHandler.INSTANCE.execute 这行代码,这个执行任务的代码
1 | <Response extends ActionResponse> void execute(NodeClient client, HttpChannel httpChannel, ActionRequest request, |
查看这个executeLocally 的实现,NodeClient

查看 NodeClient executeLocally 方法
1 | public < Request extends ActionRequest, |
在 NodeClient 内部有一个 taskManager 任务管理器,注册并执行任务。
1 | public <Request extends ActionRequest, Response extends ActionResponse> |
在往下面看
1 | public final void execute(Task task, Request request, ActionListener<Response> listener) { |
在看 proceed方法
1 |
|
我们就直接看 org.elasticsearch.action.search.TransportSearchAction#doExecute 这里是模板方法,

代码如下
1 |
|
在这里 ActionListener 这个接口 在 es里用的比较普遍,很多程序都是通过包装原有监听来进行添加额外操作的,可以学习一下,平时我们对一个 函数添加runBefore 操作的时候大都是写在 已经搭好的 算法中,这里ActionListener 是使用的装饰模式来进行增强的,源码如下
1 | static <Response> ActionListener<Response> runBefore(ActionListener<Response> delegate, CheckedRunnable<?> runBefore) { |
接下来的流程代码比较简单就用时序图表示

最终都是通过这里把数据返回给客户端,或者是发送请求到其他节点查询数据。底层有Nio实现和netty 不同的实现方式。