mirror of https://github.com/apache/lucene.git
LUCENE-10030: Lazily evaluate score in DrillSidewaysScorer.doQueryFirstScoring (#217)
This commit is contained in:
parent
0ec93b632c
commit
61f8517000
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue