【Elasticsearch源码】查询源码分析(二)

本文深入探讨Elasticsearch的查询源码,重点分析了Fetch阶段的执行流程,包括如何收集查询结果、执行Fetch操作、数据节点的Query和Fetch处理。在Fetch阶段,每个分片的查询结果通过onShardSuccess回调到协调节点,然后执行FetchSearchPhase以获取文档数据。同时,文章也提及了数据节点上的Query阶段,包括查询缓存的使用和Lucene的查询执行。
摘要由CSDN通过智能技术生成

接上一篇:【Elasticsearch源码】查询源码分析(一)

上篇讲到请求通过遍历每个shard发送请求,执行executePhaseOnShard方法,转发请求的同时定义了一个Listener,用于监听处理结果。

    private void performPhaseOnShard(final int shardIndex, final SearchShardIterator shardIt, final ShardRouting shard) {
   
        final Thread thread = Thread.currentThread();
        if (shard == null) {
   
           .....
        } else {
   
            try {
   
                executePhaseOnShard(shardIt, shard, new SearchActionListener<FirstResult>(
                    shardIt.newSearchShardTarget(shard.currentNodeId()), shardIndex) {
   
                    @Override
                    public void innerOnResponse(FirstResult result) {
   
                    	// 执行收到成功的回复
                        maybeFork(thread, () -> onShardResult(result, shardIt));
                    }
                    @Override
                    public void onFailure(Exception t) {
   
                    	// // 执行收到失败的回复
                        maybeFork(thread, () -> onShardFailure(shardIndex, shard, shard.currentNodeId(), shardIt, t));
                    }
                });
            } catch (final Exception e) {
   
                .....     
            }
        }
    }

然后进入SearchQueryThenFetchAsyncAction#executePhaseOnShard,通过SearchTransportService的sendChildRequest方法向具体的分片发送Query阶段的子任务进行异步处理。

 transportService.sendChildRequest(connection, QUERY_ACTION_NAME, request, task,
                new ConnectionCountingHandler<>(handler, reader, clientConnections, connection.getNode().getId()));

3.2 收集查询结果

每个分片在执行完毕Query子任务后,通过节点间通信,回调祖父类InitialSearchPhase的onShardSuccess方法,把查询结果记录在协调节点保存的数组结构results中,并增加计数:

    private void onShardResult(FirstResult result, SearchShardIterator shardIt) {
   
    	// 对收集到的结果进行合并
        onShardSuccess(result);
        // 检查是否所有请求都已经收到回复了
        succ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值