设为首页 收藏本站
查看: 1415|回复: 0

[经验分享] Solr查询过程源码分析

[复制链接]

尚未签到

发表于 2015-7-18 13:43:28 | 显示全部楼层 |阅读模式
  原文出自:http://blog.iyunv.com/flyingpig4/article/details/6305488
  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().docList);


|--boolean fsv = req.getParams().getBool(ResponseBuilder.FIELD_SORT_VALUES,false);   |设定fsv,用于排序字段处理
|--SortField[] sortFields  |获取排序的域
|--Field field = new Field("dummy", "", Field.Store.YES, Field.Index.NO); //  仿冒域
|--SolrIndexReader[] readers = reader.getLeafReaders();   |获取所有的IndexReader结点
|--if (readers.length==1)  subReader = readers[0]; |直接处理
|--for (SortField sortField: sortFields)  |循环处理各个排序域
|--FieldComparator comparators[] = (readers==null) ? null : new FieldComparator[readers.length]; |声明域比较器
|--DocIterator it = rb.getResults().docList.iterator(); |过滤docList集合
|--while(it.hasNext())
|--int doc = it.nextDoc();
|--idx = SolrIndexReader.readerIndex(doc, offsets); |获取id所在的Indexreader
|--comparator.copy(0, doc);
|--Object val = comparator.value(0); |获取comparator的value值
|-- vals.add(val);  |添加至vals当中
|--sortVals.add(fieldname, vals);  |添加至排序值当中
|--rsp.add("sort_values", sortVals); |设置响应对象Response的sort_values的排序值




|--process()   |多组shard处理
|--初始化操作
|-- HttpCommComponent comm = new HttpCommComponent();
|-- rb.outgoing = new LinkedList();
|-- rb.finished = new ArrayList();
|--while (nextStage != Integer.MAX_VALUE) |循环执行,设置stage状态
|-- for( SearchComponent c : components ) {
                 |--nextStage = Math.min(nextStage, c.distributedProcess(rb)); |distributedProcess(rb)根据rb的stage状态做处理
        
|-- while (rb.outgoing.size() > 0)
|--while (rb.outgoing.size() > 0)
|--ShardRequest sreq = rb.outgoing.remove(0); |取第一个请求值
|--for (String shard : sreq.actualShards)  
|--ModifiableSolrParams params = new ModifiableSolrParams(sreq.params); |设置参数
|--comm.submit(sreq, shard, params); |提交http请求,执行一个Task任务,获取Response响应
|--while (rb.outgoing.size() == 0)  
|--ShardResponse srsp = comm.takeCompletedOrError();  |获取响应
|--rb.finished.add(srsp.getShardRequest());   |完成此次搜索
|--for(SearchComponent c : components)        |完成返回的Response的处理
              |--c.handleResponses(rb, srsp.getShardRequest());
|-- for(SearchComponent c : components)
          |-- c.finishStage(rb);  |rb请求响应完成处理
         
         



|--SolrIndexSearcher.getDocSet(List)
|--if (queries.size()==1) return getDocSet(queries.get(0)) |Query集合为1则直接处理
|--for (int i=0; i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-88032-1-1.html 上篇帖子: (十) 在solr中实现同义词搜索 下篇帖子: Apache Solr 3.6.2 发布
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表