/// <summary> /// Lower-level search API. /// /// <para/> /// <seealso cref="ICollector.Collect(int)"/> is called for every document. /// /// <para/> /// NOTE: this method executes the searches on all given leaves exclusively. /// To search across all the searchers leaves use <see cref="m_leafContexts"/>. /// </summary> /// <param name="leaves"> /// The searchers leaves to execute the searches on </param> /// <param name="weight"> /// To match documents </param> /// <param name="collector"> /// To receive hits </param> /// <exception cref="BooleanQuery.TooManyClausesException"> If a query would exceed /// <see cref="BooleanQuery.MaxClauseCount"/> clauses. </exception> protected virtual void Search(IList <AtomicReaderContext> leaves, Weight weight, ICollector collector) { // TODO: should we make this // threaded...? the Collector could be sync'd? // always use single thread: foreach (AtomicReaderContext ctx in leaves) // search each subreader { try { collector.SetNextReader(ctx); } catch (CollectionTerminatedException) { // there is no doc of interest in this reader context // continue with the following leaf continue; } BulkScorer scorer = weight.GetBulkScorer(ctx, !collector.AcceptsDocsOutOfOrder, ctx.AtomicReader.LiveDocs); if (scorer != null) { try { scorer.Score(collector); } catch (CollectionTerminatedException) { // collection was terminated prematurely // continue with the following leaf } } } }
public override BulkScorer GetBulkScorer(AtomicReaderContext context, bool scoreDocsInOrder, IBits acceptDocs) { //DocIdSetIterator disi; if (outerInstance.m_filter != null) { if (Debugging.AssertsEnabled) { Debugging.Assert(outerInstance.m_query == null); } return(base.GetBulkScorer(context, scoreDocsInOrder, acceptDocs)); } else { if (Debugging.AssertsEnabled) { Debugging.Assert(outerInstance.m_query != null && innerWeight != null); } BulkScorer bulkScorer = innerWeight.GetBulkScorer(context, scoreDocsInOrder, acceptDocs); if (bulkScorer == null) { return(null); } return(new ConstantBulkScorer(outerInstance, bulkScorer, this, queryWeight)); } }