예제 #1
0
 /// <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
             }
         }
     }
 }
예제 #2
0
 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));
     }
 }