ES源码阅读——seach流程
search流程,分为查询query阶段,和fetch取回阶段,也叫query then fetch。
为什么要分成2个阶段。因为协调节点,也不知道数据分别在哪个分片上,所有在协调节点会找到所有分片,让每个分片执行查询,最后在协调节点将结果合并,返回给客户端。
假设有5个分片,查询相关度最高的10个文档,那么协调节点会让5个分片都执行查询,每个分片都要查询相关度最高的10个文档,协调节点再将50个文档再次排序,最终返回top10给客户端。
协调节点:接收客户端请求的节点。
数据节点:真正执行搜索任务的节点是数据节点。
search流程#
1、合并分片
执行查询的逻辑是在TransportSearchAction类下面,为何要起这个名字,传过来查询的动作。用SearchAction岂不是更好。
之所以用Transport,是因为查询的逻辑属于Transport模块
ES的几个模块:
- Cluster
- allocation
- discovery
- gateway
- indices
- http
- transport
- engine
查询的逻辑,会将本地的分片列表和远程的分片列表合并到一起
// 本地集群分片列表
GroupShardsIterator<ShardIterator> localShardsIterator = clusterService.operationRouting().searchShards(clusterState,
concreteIndices, routingMap, searchRequest.preference(), searchService.getResponseCollectorService(), nodeSearchCounts);
// 将本地集群分片列表和远程集群分片列表合并,得到目的分片列表
GroupShardsIterator<SearchShardIterator> shardIterators = mergeShardsIterators(localShardsIterator, localIndices,
remoteShardIterators);
2、执行查询
找到所有分片信息后,开启线程进行查询,使用的方法是searchAsyncAction。
AbstractSearchAsyncAction类是个抽象类,父类是InitialSearchPhase,InitialSearchPhase类继承了SearchPhase。SearchPhase这个类实现了CheckedRunnable接口。
@FunctionalInterface
public interface CheckedRunnable<E extends Exception> {
void run() throws E;
}
InitialSearchPhase的run方法,对所有分片执行遍历
if (shardsIts.size() > 0) {
int maxConcurrentShardRequests = Math.min(this.maxConcurrentShardRequests, shardsIts.size());
for (int index = 0; index < maxConcurrentShardRequests; index++) {
final SearchShardIterator shardRoutings = shardsIts.get(index);
assert shardRoutings.skip() == false;
// 分片执行遍历的逻辑
performPhaseOnShard(index, shardRoutings, shardRoutings.nextOrNull());
}
}
fetch流程#
作者: 清泉白石
出处:https://www.cnblogs.com/fonxian/p/14870862.html
版权:本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)