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