BoboIndexReader继承于FilterIndexReader,这个类是对IndexReader的进一步包装,
首先看构造函数
protected BoboIndexReader(IndexReader reader, Collection<FacetHandler<?>> facetHandlers, Collection<RuntimeFacetHandlerFactory<?,?>> facetHandlerFactories, WorkArea workArea, boolean useSubReaders) throws IOException { super(useSubReaders ? new MultiReader(createSubReaders(reader, workArea), false) : reader); if(useSubReaders)//是否使用多IndexReader { _dir = reader.directory(); BoboIndexReader[] subReaders = (BoboIndexReader[])in.getSequentialSubReaders(); if(subReaders != null && subReaders.length > 0) { _subReaders = subReaders; int maxDoc = 0; _starts = new int[_subReaders.length + 1]; for (int i = 0; i < _subReaders.length; i++) { _subReaders[i]._dir = _dir; if(facetHandlers != null) _subReaders[i].setFacetHandlers(facetHandlers); _starts[i] = maxDoc; maxDoc += _subReaders[i].maxDoc(); } _starts[_subReaders.length] = maxDoc; } } _runtimeFacetHandlerFactories = facetHandlerFactories; _runtimeFacetHandlerFactoryMap = new HashMap<String,RuntimeFacetHandlerFactory<?,?>>(); if (_runtimeFacetHandlerFactories!=null) { for(RuntimeFacetHandlerFactory<?,?> factory : _runtimeFacetHandlerFactories) { _runtimeFacetHandlerFactoryMap.put(factory.getName(), factory); } } _facetHandlers = facetHandlers; _workArea = workArea; }
BoboIndexReader在多IndexReader的情况下,将所有的IndexReader的doc[]虚拟成一个,后一个Index的doc的id号在前面所有的indexReader的doc总数的基础上相加
_starts 是一个int[ ]类型的数组,保存了每一个IndexReader的第一个doc在这个虚拟的大的doc[]中的位置
搜索的时候最主要的函数是browse( ),多个BoboIndexReader的情况下,最终是调用的BoboSubBrowser中的
browse()函数:
public BrowseResult browse(BrowseRequest req) throws BrowseException { if (_reader == null) return new BrowseResult(); final BrowseResult result = new BrowseResult(); long start = System.currentTimeMillis(); //创建排序收集器,这里返回得到的是SortCollectorImpl的实例 SortCollector collector = getSortCollector(req.getSort(),req.getQuery(), req.getOffset(), req.getCount(), req.isFetchStoredFields(),false); Map<String, FacetAccessible> facetCollectors = new HashMap<String, FacetAccessible>(); //搜索过程 browse(req, collector, facetCollectors); BrowseHit[] hits = null; try { //收集命中结果 hits = collector.topDocs(); } catch (IOException e) { logger.error(e.getMessage(), e); hits = new BrowseHit[0]; } Query q = req.getQuery(); if (q == null){ q = new MatchAllDocsQuery(); } if (req.isShowExplanation()){ for (BrowseHit hit : hits){ try { Explanation expl = explain(q, hit.getDocid()); hit.setExplanation(expl); } catch (IOException e) { logger.error(e.getMessage(),e); } } } result.setHits(hits); result.setNumHits(collector.getTotalHits()); result.setTotalDocs(_reader.numDocs()); result.addAll(facetCollectors); long end = System.currentTimeMillis(); result.setTime(end - start); return result; }