【转】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

目录
相关文章
|
1月前
|
SQL 消息中间件 缓存
执行流程优化总结
本文总结了五种优化方法:1) 将循环内的IO和远程调用批量化,减少重复请求;2) 优化数据库SQL和索引以提升查询速度;3) 对常用查询结果进行缓存;4) 并行化串行远程调用(注意可能引发内存问题和上下文丢失);5) 将非核心功能如消息通知、积分操作异步化,通过消息队列处理。
17 2
|
4月前
|
SQL 缓存 关系型数据库
一条SQL执行是如何执行的?它的执行流程是什么?跟我一起探索吧!
一条SQL执行是如何执行的?它的执行流程是什么?跟我一起探索吧!
一条SQL执行是如何执行的?它的执行流程是什么?跟我一起探索吧!
|
9月前
|
XML Java 数据格式
【spring源码系列-05】refresh中prepareRefresh方法的执行流程
【spring源码系列-05】refresh中prepareRefresh方法的执行流程
106 0
|
6月前
|
API Go 开发工具
CreateCollection_dataSyncService_执行流程源码解析
CreateCollection_dataSyncService_执行流程源码解析
56 0
|
8月前
|
存储 Java
线程池的核心参数和执行流程
本章主要讲解了线程池的核心参数和执行流程
81 0
|
9月前
|
存储 XML Java
【spring源码系列-06】refresh中obtainFreshBeanFactory方法的执行流程
【spring源码系列-06】refresh中obtainFreshBeanFactory方法的执行流程
67 0
|
11月前
|
SQL XML Java
从源码层面解释:为什么执行MyBatis接口就可以执行SQL?
1:场景分析 在我们使用SpringBoot+MyBatis的时候,我们一般是先引入依赖,然后配置
|
SQL 存储 自然语言处理
MyBatis 学习笔记(八)---源码分析篇--SQL 执行过程详细分析
在面试中我们经常会被到MyBatis中 #{} 占位符与${}占位符的区别。大多数的小伙伴都可以脱口而出#{} 会对值进行转义,防止SQL注入。而${}则会原样输出传入值,不会对传入值做任何处理。本文将通过源码层面分析为啥#{} 可以防止SQL注入。
247 0
MyBatis 学习笔记(八)---源码分析篇--SQL 执行过程详细分析
|
Java 容器
sprigboot中过滤器执行顺序源码解读
本文主要是搞清楚对于同一请求在springboot项目中自定义的filter和jar包中的filter的执行顺序是如何指定的。
sprigboot中过滤器执行顺序源码解读
|
Go 开发者
for 循环语法和执行流程 | 学习笔记
快速学习 for 循环语法和执行流程
253 0
for 循环语法和执行流程 | 学习笔记