资源描述:
《Solr查询过程源码分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、SearchHandler.handleRequestBody():solr搜索主流程1.调用:RequestHandlerBase
2、--handleRequest(req,rsp);2.源码分析:
3、-prepare()
4、前期的请求参数准备工作,QueryComponent可以在schemal文件中设置,易扩展
5、--SearchComponentc:components
6、--queryComponent.prepare()
7、--FQ,FL,SHARDS,Q.SHARDS.RO
8、WS,SHARDS.START
9、设置查询的条件,包括分片的查询条件
10、--设置fieldFlags返回的field值
11、--设置defType值
12、默认lucene,实际指向的是lucenePlugin,可在schema文件中扩展
13、--解析QueryParser|对queryString进行解析
14、--解析fq过滤值,生成filter过滤query集
15、--设定shards分片信息
16、--statComponent.prepare()
17、--debugComponent.prepare()
18、--process()
19、单组无shard情况处理
20、--
21、Stringids=params.get(ShardParams.IDS);
22、获取shardDoc的id集合,不为空往下执行
23、--通过ids获取文档id的集合,并为下一步获取DocList做准备
24、--intid=req.getSearcher().getFirstMatch(
25、--newTerm(idField.getName(),idField.getType().toInternal(idArr.get(i))));
26、--luceneIds[docs++]=id;
27、--res.docList=newDocSlice(0,doc
28、s,luceneIds,null,docs,0);
29、--if(rb.isNeedDocSet())存在DocSet需求
30、--queries.add(rb.getQuery());
31、queryString的查询条件
32、--queries.addAll(filters);
33、filter查询条件
34、--res.docSet=searcher.getDocSet(queries);
35、通过queries条件进行DocSet查询
36、--rb.setResults(res);
37、设置结果返回值
38、--rsp.add("response",rb.getRe
39、sults().docList);
40、--return;
41、获取结果集后返回
42、--SolrIndexSearcher.QueryCommandcmd=rb.getQueryCommand();
43、获取查询封装的QueryCommand对象
44、--searcher.search(result,cmd);
45、--getDocListC(qr,cmd);
46、--rb.setResult(result);
47、与上同
48、--rsp.add("response",rb.getResults().docList);
49、--booleanfsv=req.getPa
50、rams().getBool(ResponseBuilder.FIELD_SORT_VALUES,false);
51、设定fsv,用于排序字段处理
52、--SortField[]sortFields
53、获取排序的域
54、--Fieldfield=newField("dummy","",Field.Store.YES,Field.Index.NO);//仿冒域
55、--SolrIndexReader[]readers=reader.getLeafReaders();
56、获取所有的IndexReader结点
57、--if(readers.length==1)
58、subReader=readers[0];
59、直接处理
60、--for(SortFieldsortField:sortFields)
61、循环处理各个排序域
62、--FieldComparatorcomparators[]=(readers==null)?null:newFieldComparator[readers.length];
63、声明域比较器
64、--DocIteratorit=rb.getResults().docList.iterator();
65、过滤docList集合
66、--while(it.hasNext())
67、--intdoc=it.n
68、extDoc();
69、--idx=SolrIndexReader.readerIndex(doc,offsets);
70、获取id所在的Indexreader
71、--comparator.copy(0,doc);
72、--Objectval=comparato