【转】SolrQuery--EmbeddedServer执行流程回顾

简介: 假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。

image.png

TerminatorQueryRequest extends SolrQuery==

执行HSF封装的TerminatorService.query(SolrQuery),订阅了TerminatorService

==>这个HSF服务发布在:DefaultTerminatorService

==>回到DefaultTerminatorService中,找到query(SolrQuery )方法

==》这个方法里面依赖EmbeddedServer.query(query) 执行查询请求。

==EmbeddedServer extends SolrServerquery(query) 转入SolrServerquery(SolrParams)

TerminatorQueryRequest extend SolrQuery,SolrQuery extends ModifiableSolrParams, ModefiableSolrParams extends SolrParams

==》在SolrServer中执行了 QueryRequest( params).process(), 首先new QueryRequest对象。

==>接着QueryRequest. process() new QueryResponse( server.request( this ), server ); 返回response. 其中server. request() EmbededServer中的方法,执行结果作为QueryResponse

==》回到EmbededServer中的request方法中,

==》在EmbededServer.request中,通过core.getRequestHandler(path), 返回SolrRequestHandler

==》在EmbededServer.request中,core.execute(handler,req,rsp)

然后执行底层查询工作。而requestHandler是在solrcofig.xml 中配置注入。最终回到SolrCore ,由他管理整个core信息。包括cache信息的维护。

[1] SolrRequestHandler

Core.execute中,由SolrRequestHandler 管理 SolrQueryRequest+SolrQueryResponse

SolrRequestHandler中提取参数(paramssolrcore

SolrRequestHandler 是在solrconfig.xml中配置注入的,

SolrIndexSearcher 是被SolrQueryRequest管理起来,

 SolrRequestHandler handler = core.getRequestHandler( path );不同的path对应不同的SolrRequestHandler

==》在solrcoresolrcore.execute

==》在executesearchhandler会执行handler.handlerRequest()

==SolrRequestHandler.handleRequestBody()

==》其中重要一步是SearchComponent 加载

==query构件是必须要有的QueryComponent

==》在querycomponent内部先执行prepare

==》在querycomponent内容执行完了prepare之后执行process

==SolrQueryRequest.solrIndexSearcher.getDocSet()

==>结果putresoponse中返回

[2]SolrQueryRequest

EmbededSolrServer.request, SolrQueryRequest是由_parser.buildRequestFrom(core, params, request.getContentStreams() 生成,_parser = new SolrRequestParsers( null );

_parser.buildRequestFrom()方法里面,return SolrQueryRequestBase implements SolrQueryRequest,里面有RefCounted<SolrIndexSearcher> searcherHolder = core.getSearcher();,调用core.getSearcher() 返回得到solrIndexSearcher引用。

Coresearcher是被上层request共享的,上层request又是有缓存的,searcher又与cache一一绑定,而不是针对core层的缓存。

[3]SolrQueryResponse

EmbededSolrServer.request,new  SolrQueryResponse对象。

updateHandler是在solrcorecreateUpdateHandler() 生成的,反射方法生成该实例。不同的updateHandler set不同的对应更新目录。

org.apache.solr.handler.component.ResponseBuild 封装了SolrQueryRequestSolrQueryResponseSolrQueryRequest中封装了getSearcher(),返回SolrIndexSearcher

SearchComponent 主要子类如下,solrcoreloadSearchComponent默认会加载6(highlisght\query\facet\mlt\stats\debug)

query QueryComponent

debug DebugComponent

facet FacetComponent

highlight HighlighComponent

stats StatsComponent

terms TermsComponent

termVectors TermVectorComponent

mlt MoreLikeThisComponent

 

SolrIndexSearcher

目录
相关文章
|
Java Spring
如何优雅的关闭线程池?
使用自创建的线程跟使用线程池有啥区别?提到线程池是不是脑海中闪现了创建线程池的那几个核心参数、工作流程、线程池的复用、拒绝机制、缓冲机制等,这些理论知识点想必也牢记许久了。虽然线程池支持在虚拟机进程接受到退出命令后可以进行shutdown。那么shutdown跟线程中断又有什么区别?在运行中的线程能否直接kill掉?我们能否监听关闭事件进行补偿?
3138 1
如何优雅的关闭线程池?
|
8月前
|
机器学习/深度学习 搜索推荐 算法
Python大数据驱动的图书推荐与分析系统:从数据到智能决策的实践探索
在信息爆炸时代,图书推荐系统利用Python大数据技术,融合用户行为、图书元数据与外部动态,构建“内容+协同+深度学习”混合模型,实现精准个性化推荐。通过三层架构与算法创新,破解冷启动、小众书推荐等难题,助力每本书找到真正读者。
601 0
|
人工智能 JavaScript Java
深度测评国产 AI 程序员,在 QwQ 和满血版 DeepSeek 助力下,哪些能力让你眼前一亮?
阿里云发布并开源全新的推理模型通义千问QwQ-32B。通过大规模强化学习,千问QwQ-32B在数学、代码及通用能力上实现质的飞跃,整体性能比肩DeepSeek-R1。在保持强劲性能的同时,千问QwQ-32B还大幅降低了部署使用成本,在消费级显卡上也能实现本地部署。
1113 57
|
Java 编译器
Java 泛型详细解析
本文将带你详细解析 Java 泛型,了解泛型的原理、常见的使用方法以及泛型的局限性,让你对泛型有更深入的了解。
589 2
Java 泛型详细解析
|
Java 数据库连接
【线程池使用完毕为何必须shutdown】
【线程池使用完毕为何必须shutdown】
598 0
|
Java
SpringBoot下国际化配置
SpingBoot实现国际化配置步骤
2417 0
SpringBoot下国际化配置
|
存储 开发框架 Java
SpringBoot整合Minio文件存储
该文档介绍了如何在公司开发框架中集成Minio以满足附件存储需求。由于规定附件服务器需与应用服务器分离且不使用云存储,Minio被选为解决方案。步骤包括:下载Minio部署包,创建配置文件(如`minio-service.xml`和`run.bat`),设置存储路径和访问凭据,安装服务并启动。之后,通过配置POM和YML文件以整合到项目中。此外,还提供了Minio工具类的初始化、上传、下载和删除文件的Java代码示例。
400 0
|
算法 机器人
改进算法|混合策略改进的蝴蝶优化算法
改进算法|混合策略改进的蝴蝶优化算法
|
JavaScript 内存技术
fnm 安装、卸载与使用(详细步骤)
fnm 安装、卸载与使用(详细步骤)
1256 0