LUCENE-10030: Lazily evaluate score in DrillSidewaysScorer.doQueryFirstScoring (#217)

This commit is contained in:
Grigoriy Troitskiy 2021-07-26 23:04:51 +03:00 committed by GitHub
parent 0ec93b632c
commit 61f8517000
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 16 additions and 8 deletions

View File

@ -26,6 +26,7 @@ import org.apache.lucene.search.Collector;
import org.apache.lucene.search.DocIdSetIterator; import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.LeafCollector; import org.apache.lucene.search.LeafCollector;
import org.apache.lucene.search.Scorable; import org.apache.lucene.search.Scorable;
import org.apache.lucene.search.ScoreCachingWrappingScorer;
import org.apache.lucene.search.Scorer; import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.TwoPhaseIterator; import org.apache.lucene.search.TwoPhaseIterator;
import org.apache.lucene.util.Bits; import org.apache.lucene.util.Bits;
@ -86,17 +87,13 @@ class DrillSidewaysScorer extends BulkScorer {
// System.out.println("\nscore: reader=" + context.reader()); // System.out.println("\nscore: reader=" + context.reader());
// } // }
// System.out.println("score r=" + context.reader()); // System.out.println("score r=" + context.reader());
ScoreAndDoc scorer = new ScoreAndDoc();
collector.setScorer(scorer);
if (drillDownCollector != null) { if (drillDownCollector != null) {
drillDownLeafCollector = drillDownCollector.getLeafCollector(context); drillDownLeafCollector = drillDownCollector.getLeafCollector(context);
drillDownLeafCollector.setScorer(scorer);
} else { } else {
drillDownLeafCollector = null; drillDownLeafCollector = null;
} }
for (DocsAndCost dim : dims) { for (DocsAndCost dim : dims) {
dim.sidewaysLeafCollector = dim.sidewaysCollector.getLeafCollector(context); dim.sidewaysLeafCollector = dim.sidewaysCollector.getLeafCollector(context);
dim.sidewaysLeafCollector.setScorer(scorer);
} }
// some scorers, eg ReqExlScorer, can hit NPE if cost is called after nextDoc // some scorers, eg ReqExlScorer, can hit NPE if cost is called after nextDoc
@ -155,6 +152,8 @@ class DrillSidewaysScorer extends BulkScorer {
// if (DEBUG) { // if (DEBUG) {
// System.out.println(" doQueryFirstScoring"); // System.out.println(" doQueryFirstScoring");
// } // }
setScorer(collector, new ScoreCachingWrappingScorer(baseScorer));
int docID = baseScorer.docID(); int docID = baseScorer.docID();
nextDoc: nextDoc:
@ -195,10 +194,6 @@ class DrillSidewaysScorer extends BulkScorer {
collectDocID = docID; collectDocID = docID;
// TODO: we could score on demand instead since we are
// daat here:
collectScore = baseScorer.score();
if (failedCollector == null) { if (failedCollector == null) {
// Hit passed all filters, so it's "real": // Hit passed all filters, so it's "real":
collectHit(collector, dims); collectHit(collector, dims);
@ -214,6 +209,8 @@ class DrillSidewaysScorer extends BulkScorer {
/** Used when drill downs are highly constraining vs baseQuery. */ /** Used when drill downs are highly constraining vs baseQuery. */
private void doDrillDownAdvanceScoring( private void doDrillDownAdvanceScoring(
Bits acceptDocs, LeafCollector collector, DocsAndCost[] dims) throws IOException { Bits acceptDocs, LeafCollector collector, DocsAndCost[] dims) throws IOException {
setScorer(collector, new ScoreAndDoc());
final int maxDoc = context.reader().maxDoc(); final int maxDoc = context.reader().maxDoc();
final int numDims = dims.length; final int numDims = dims.length;
@ -424,6 +421,7 @@ class DrillSidewaysScorer extends BulkScorer {
// if (DEBUG) { // if (DEBUG) {
// System.out.println(" doUnionScoring"); // System.out.println(" doUnionScoring");
// } // }
setScorer(collector, new ScoreAndDoc());
final int maxDoc = context.reader().maxDoc(); final int maxDoc = context.reader().maxDoc();
final int numDims = dims.length; final int numDims = dims.length;
@ -598,6 +596,16 @@ class DrillSidewaysScorer extends BulkScorer {
sidewaysCollector.collect(collectDocID); sidewaysCollector.collect(collectDocID);
} }
private void setScorer(LeafCollector mainCollector, Scorable scorer) throws IOException {
mainCollector.setScorer(scorer);
if (drillDownLeafCollector != null) {
drillDownLeafCollector.setScorer(scorer);
}
for (DocsAndCost dim : dims) {
dim.sidewaysLeafCollector.setScorer(scorer);
}
}
private final class ScoreAndDoc extends Scorable { private final class ScoreAndDoc extends Scorable {
@Override @Override