public override bool Score(ICollector c, int maxDoc) { Debug.Assert(doc == -1); doc = 3000; FakeScorer fs = new FakeScorer(); fs.doc = doc; fs.score = 1.0f; c.SetScorer(fs); c.Collect(3000); return(false); }
public override bool Score(Collector c, int maxDoc) { Debug.Assert(doc == -1); doc = 3000; FakeScorer fs = new FakeScorer(); fs.SetDoc(doc); fs.SetScore(1.0f); c.Scorer = fs; c.Collect(3000); return(false); }
public override TopDocs Rescore(IndexSearcher searcher, TopDocs firstPassTopDocs, int topN) { // Copy ScoreDoc[] and sort by ascending docID: ScoreDoc[] hits = (ScoreDoc[])firstPassTopDocs.ScoreDocs.Clone(); Array.Sort(hits, new ComparerAnonymousInnerClassHelper(this)); IList <AtomicReaderContext> leaves = searcher.IndexReader.Leaves; TopFieldCollector collector = TopFieldCollector.Create(sort, topN, true, true, true, false); // Now merge sort docIDs from hits, with reader's leaves: int hitUpto = 0; int readerUpto = -1; int endDoc = 0; int docBase = 0; FakeScorer fakeScorer = new FakeScorer(); while (hitUpto < hits.Length) { ScoreDoc hit = hits[hitUpto]; int docID = hit.Doc; AtomicReaderContext readerContext = null; while (docID >= endDoc) { readerUpto++; readerContext = leaves[readerUpto]; endDoc = readerContext.DocBase + readerContext.Reader.MaxDoc; } if (readerContext != null) { // We advanced to another segment: collector.SetNextReader(readerContext); collector.SetScorer(fakeScorer); docBase = readerContext.DocBase; } fakeScorer.score = hit.Score; fakeScorer.doc = docID - docBase; collector.Collect(fakeScorer.doc); hitUpto++; } return(collector.GetTopDocs()); }
public override Explanation Explain(IndexSearcher searcher, Explanation firstPassExplanation, int docID) { Explanation result = base.Explain(searcher, firstPassExplanation, docID); IList<AtomicReaderContext> leaves = searcher.IndexReader.Leaves; int subReader = ReaderUtil.SubIndex(docID, leaves); AtomicReaderContext readerContext = leaves[subReader]; int docIDInSegment = docID - readerContext.DocBase; var context = new Dictionary<string, object>(); var fakeScorer = new FakeScorer { score = firstPassExplanation.Value, doc = docIDInSegment }; context["scorer"] = fakeScorer; foreach (string variable in expression.variables) { result.AddDetail(new Explanation((float)bindings.GetValueSource(variable).GetValues (context, readerContext).DoubleVal(docIDInSegment), "variable \"" + variable + "\"" )); } return result; }
public override bool Score(Collector c, int maxDoc) { Debug.Assert(doc == -1); doc = 3000; FakeScorer fs = new FakeScorer(); fs.SetDoc(doc); fs.SetScore(1.0f); c.Scorer = fs; c.Collect(3000); return false; }
public override bool Score(Collector collector, int max) { bool more; Bucket tmp; FakeScorer fs = new FakeScorer(); // The internal loop will set the score and doc before calling collect. collector.Scorer = fs; do { bucketTable.First = null; while (Current != null) // more queued { // check prohibited & required if ((Current.Bits & PROHIBITED_MASK) == 0) { // TODO: re-enable this if BQ ever sends us required // clauses //&& (current.bits & requiredMask) == requiredMask) { // NOTE: Lucene always passes max = // Integer.MAX_VALUE today, because we never embed // a BooleanScorer inside another (even though // that should work)... but in theory an outside // app could pass a different max so we must check // it: if (Current.Doc >= max) { tmp = Current; Current = Current.Next; tmp.Next = bucketTable.First; bucketTable.First = tmp; continue; } if (Current.Coord >= MinNrShouldMatch) { fs.score = (float)(Current.Score * CoordFactors[Current.Coord]); fs.doc = Current.Doc; fs.freq = Current.Coord; collector.Collect(Current.Doc); } } Current = Current.Next; // pop the queue } if (bucketTable.First != null) { Current = bucketTable.First; bucketTable.First = Current.Next; return(true); } // refill the queue more = false; End += BucketTable.SIZE; for (SubScorer sub = Scorers; sub != null; sub = sub.Next) { if (sub.More) { sub.More = sub.Scorer.Score(sub.Collector, End); more |= sub.More; } } Current = bucketTable.First; } while (Current != null || more); return(false); }
public void SetScorer(Scorer scorer) { this.scorer = scorer; fakeScorer = new FakeScorer(); @in.SetScorer(fakeScorer); }
public void SetScorer(Scorer scorer) { this.Scorer_Renamed = scorer; fakeScorer = new FakeScorer(); @in.SetScorer(fakeScorer); }
public override bool Score(Collector collector, int max) { bool more; Bucket tmp; FakeScorer fs = new FakeScorer(); // The internal loop will set the score and doc before calling collect. collector.Scorer = fs; do { bucketTable.First = null; while (Current != null) // more queued { // check prohibited & required if ((Current.Bits & PROHIBITED_MASK) == 0) { // TODO: re-enable this if BQ ever sends us required // clauses //&& (current.bits & requiredMask) == requiredMask) { // NOTE: Lucene always passes max = // Integer.MAX_VALUE today, because we never embed // a BooleanScorer inside another (even though // that should work)... but in theory an outside // app could pass a different max so we must check // it: if (Current.Doc >= max) { tmp = Current; Current = Current.Next; tmp.Next = bucketTable.First; bucketTable.First = tmp; continue; } if (Current.Coord >= MinNrShouldMatch) { fs.score = (float)(Current.Score * CoordFactors[Current.Coord]); fs.doc = Current.Doc; fs.freq = Current.Coord; collector.Collect(Current.Doc); } } Current = Current.Next; // pop the queue } if (bucketTable.First != null) { Current = bucketTable.First; bucketTable.First = Current.Next; return true; } // refill the queue more = false; End += BucketTable.SIZE; for (SubScorer sub = Scorers; sub != null; sub = sub.Next) { if (sub.More) { sub.More = sub.Scorer.Score(sub.Collector, End); more |= sub.More; } } Current = bucketTable.First; } while (Current != null || more); return false; }