Solr查询过程源码分析

本文深入剖析了Solr的搜索处理流程,从SearchHandler的handleRequestBody方法开始,详细介绍了参数准备、QueryComponent的prepare阶段,包括设置查询条件、解析QueryParser、构建filter集、处理分片信息等。接着讲解了单组和多组shard情况下处理过程,涉及到DocSet的获取、排序字段的处理以及分布式处理。最后阐述了如何通过QueryCommand进行查找并利用缓存优化查询性能。
摘要由CSDN通过智能技术生成
SearchHandler.handleRequestBody():
solr搜索主流程
1.调用:RequestHandlerBase
	|--handleRequest(req, rsp);
2.源码分析:
|-prepare() |前期的请求参数准备工作,QueryComponent可以在schemal文件中设置,易扩展
	|-- SearchComponent c : components   
               |--queryComponent.prepare()   	

			|--FQ,FL,SHARDS,Q.SHARDS.ROWS,SHARDS.START  |设置查询的条件,包括分片的查询条件  
			|--设置fieldFlags返回的field值
			|--设置defType值 |默认lucene,实际指向的是lucenePlugin,可在schema文件中扩展
			|--解析QueryParser |对queryString进行解析
      			|--解析fq过滤值,生成filter过滤query集
			|--设定shards分片信息
		|--statComponent.prepare()   
	       	|--debugComponent.prepare()


|--process()   |单组无shard情况处理
	|--String ids = params.get(ShardParams.IDS); |获取shardDoc的id集合,不为空往下执行
		|--通过ids获取文档id的集合,并为下一步获取DocList做准备
			|--int id = req.getSearcher().getFirstMatch(   
                		|--new Term(idField.getName(), idField.getType().toInternal(idArr.get(i))));
			|-- luceneIds[docs++] = id;  
			|-- res.docList = new DocSlice(0, docs, luceneIds, null, docs, 0);

                |--if (rb.isNeedDocSet()) 存在DocSet需求
			|--queries.add(rb.getQuery()); |queryString的查询条件
			|--queries.addAll(filters);    |filter查询条件
			|--res.docSet = searcher.getDocSet(queries);  |通过queries条件进行DocSet查询
		|--rb.setResults(res);  |设置结果返回值
	        |--rsp.add("response",rb.getResults().docList);
		|--return; |获取结果集后返回
 
	|--SolrIndexSearcher.QueryCommand cmd = rb.getQueryCommand();  |获取查询封装的QueryCommand对象
	|--searcher.search(result,cmd);
		|--getDocListC(qr,cmd); 
	|--rb.setResult( result );   |与上同
    	|--rsp.add("response",rb.getResults().docLis
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值