TerminatorQueryRequest extends SolrQuery==》
执行HSF封装的TerminatorService.query(SolrQuery),订阅了TerminatorService
==>这个HSF服务发布在:DefaultTerminatorService
==>回到DefaultTerminatorService中,找到query(SolrQuery )方法
==》这个方法里面依赖EmbeddedServer.query(query) 执行查询请求。
==》EmbeddedServer extends SolrServer,query(query) 转入SolrServer中query(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中提取参数(params,solrcore)
SolrRequestHandler 是在solrconfig.xml中配置注入的,
SolrIndexSearcher 是被SolrQueryRequest管理起来,
SolrRequestHandler handler = core.getRequestHandler( path );不同的path对应不同的SolrRequestHandler。
==》在solrcore中solrcore.execute
==》在execute中searchhandler会执行handler.handlerRequest()
==》SolrRequestHandler.handleRequestBody()
==》其中重要一步是SearchComponent 加载
==》query构件是必须要有的QueryComponent
==》在querycomponent内部先执行prepare
==》在querycomponent内容执行完了prepare之后执行process
==》SolrQueryRequest.solrIndexSearcher.getDocSet()
==>结果put到resoponse中返回
[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引用。
Core的searcher是被上层request共享的,上层request又是有缓存的,searcher又与cache一一绑定,而不是针对core层的缓存。
[3]SolrQueryResponse
在EmbededSolrServer.request中,new SolrQueryResponse对象。
updateHandler是在solrcore中createUpdateHandler() 生成的,反射方法生成该实例。不同的updateHandler set不同的对应更新目录。
org.apache.solr.handler.component.ResponseBuild 封装了SolrQueryRequest、SolrQueryResponse,SolrQueryRequest中封装了getSearcher(),返回SolrIndexSearcher
SearchComponent 主要子类如下,solrcore中loadSearchComponent默认会加载6个(highlisght\query\facet\mlt\stats\debug)
query QueryComponent
debug DebugComponent
facet FacetComponent
highlight HighlighComponent
stats StatsComponent
terms TermsComponent
termVectors TermVectorComponent
mlt MoreLikeThisComponent
SolrIndexSearcher