public SearcherCallableNoSort(ReentrantLock @lock, IndexSearcher searcher, LeafSlice slice, Weight weight, ScoreDoc after, int nDocs, HitQueue hq) { this.@lock = @lock; this.searcher = searcher; this.weight = weight; this.after = after; this.nDocs = nDocs; this.hq = hq; this.slice = slice; }
/// <summary> /// Expert: Low-level search implementation. Finds the top <paramref name="nDocs"/> /// hits for <c>query</c>, applying <c>filter</c> if non-null. /// /// <para/>Applications should usually call <see cref="IndexSearcher.Search(Query,int)"/> or /// <see cref="IndexSearcher.Search(Query,Filter,int)"/> instead. </summary> /// <exception cref="BooleanQuery.TooManyClausesException"> If a query would exceed /// <see cref="BooleanQuery.MaxClauseCount"/> clauses. </exception> protected virtual TopDocs Search(Weight weight, ScoreDoc after, int nDocs) { int limit = reader.MaxDoc; if (limit == 0) { limit = 1; } if (after != null && after.Doc >= limit) { throw new System.ArgumentException("after.doc exceeds the number of documents in the reader: after.doc=" + after.Doc + " limit=" + limit); } nDocs = Math.Min(nDocs, limit); if (executor == null) { return(Search(m_leafContexts, weight, after, nDocs)); } else { HitQueue hq = new HitQueue(nDocs, false); ReentrantLock @lock = new ReentrantLock(); ExecutionHelper <TopDocs> runner = new ExecutionHelper <TopDocs>(executor); for (int i = 0; i < m_leafSlices.Length; i++) // search each sub { runner.Submit(new SearcherCallableNoSort(@lock, this, m_leafSlices[i], weight, after, nDocs, hq)); } int totalHits = 0; float maxScore = float.NegativeInfinity; foreach (TopDocs topDocs in runner) { if (topDocs.TotalHits != 0) { totalHits += topDocs.TotalHits; maxScore = Math.Max(maxScore, topDocs.MaxScore); } } var scoreDocs = new ScoreDoc[hq.Count]; for (int i = hq.Count - 1; i >= 0; i--) // put docs in array { scoreDocs[i] = hq.Pop(); } return(new TopDocs(totalHits, scoreDocs, maxScore)); } }