diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 42a6e8073576..ca2005b0b699 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -291,7 +291,12 @@ Improvements Optimizations --------------------- -(No changes) + +* GITHUB#16294: Route constant-score doc-values queries through + ConstantScoreScorerSupplier so they can benefit from batch scoring. + Affects BinaryRangeFieldRangeQuery, LatLonDocValuesBoxQuery, + LatLonDocValuesQuery, XYDocValuesPointInGeometryQuery, and + SortedNumericDocValuesSetQuery. (Costin Leau) Bug Fixes --------------------- diff --git a/lucene/core/src/java/org/apache/lucene/document/BinaryRangeFieldRangeQuery.java b/lucene/core/src/java/org/apache/lucene/document/BinaryRangeFieldRangeQuery.java index 140227746f0d..f7d5d19ea894 100644 --- a/lucene/core/src/java/org/apache/lucene/document/BinaryRangeFieldRangeQuery.java +++ b/lucene/core/src/java/org/apache/lucene/document/BinaryRangeFieldRangeQuery.java @@ -23,7 +23,7 @@ import org.apache.lucene.index.DocValues; import org.apache.lucene.index.LeafReader; import org.apache.lucene.index.LeafReaderContext; -import org.apache.lucene.search.ConstantScoreScorer; +import org.apache.lucene.search.ConstantScoreScorerSupplier; import org.apache.lucene.search.ConstantScoreWeight; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; @@ -135,8 +135,11 @@ public float matchCost() { } }; - final var scorer = new ConstantScoreScorer(score(), scoreMode, iterator); - return new DefaultScorerSupplier(scorer); + return ConstantScoreScorerSupplier.fromIterator( + TwoPhaseIterator.asDocIdSetIterator(iterator), + score(), + scoreMode, + context.reader().maxDoc()); } @Override diff --git a/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesBoxQuery.java b/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesBoxQuery.java index ac01e4c74f33..d6593fda51eb 100644 --- a/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesBoxQuery.java +++ b/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesBoxQuery.java @@ -22,7 +22,7 @@ import org.apache.lucene.index.DocValues; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.SortedNumericDocValues; -import org.apache.lucene.search.ConstantScoreScorer; +import org.apache.lucene.search.ConstantScoreScorerSupplier; import org.apache.lucene.search.ConstantScoreWeight; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; @@ -153,8 +153,11 @@ public float matchCost() { return 5; // 5 comparisons } }; - final var scorer = new ConstantScoreScorer(boost, scoreMode, iterator); - return new DefaultScorerSupplier(scorer); + return ConstantScoreScorerSupplier.fromIterator( + TwoPhaseIterator.asDocIdSetIterator(iterator), + boost, + scoreMode, + context.reader().maxDoc()); } @Override diff --git a/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesQuery.java b/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesQuery.java index 45a7bc0eb521..65fc6b664d14 100644 --- a/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesQuery.java +++ b/lucene/core/src/java/org/apache/lucene/document/LatLonDocValuesQuery.java @@ -29,7 +29,7 @@ import org.apache.lucene.index.DocValues; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.SortedNumericDocValues; -import org.apache.lucene.search.ConstantScoreScorer; +import org.apache.lucene.search.ConstantScoreScorerSupplier; import org.apache.lucene.search.ConstantScoreWeight; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; @@ -158,8 +158,11 @@ public ScorerSupplier scorerSupplier(LeafReaderContext context) throws IOExcepti throw new IllegalArgumentException( "Invalid query relationship:[" + queryRelation + "]"); } - final var scorer = new ConstantScoreScorer(boost, scoreMode, iterator); - return new DefaultScorerSupplier(scorer); + return ConstantScoreScorerSupplier.fromIterator( + TwoPhaseIterator.asDocIdSetIterator(iterator), + boost, + scoreMode, + context.reader().maxDoc()); } @Override diff --git a/lucene/core/src/java/org/apache/lucene/document/SortedNumericDocValuesSetQuery.java b/lucene/core/src/java/org/apache/lucene/document/SortedNumericDocValuesSetQuery.java index 53966bb02c3d..7b7028d5be5b 100644 --- a/lucene/core/src/java/org/apache/lucene/document/SortedNumericDocValuesSetQuery.java +++ b/lucene/core/src/java/org/apache/lucene/document/SortedNumericDocValuesSetQuery.java @@ -23,7 +23,7 @@ import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.NumericDocValues; import org.apache.lucene.index.SortedNumericDocValues; -import org.apache.lucene.search.ConstantScoreScorer; +import org.apache.lucene.search.ConstantScoreScorerSupplier; import org.apache.lucene.search.ConstantScoreWeight; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.MatchNoDocsQuery; @@ -150,8 +150,11 @@ public float matchCost() { } }; } - final var scorer = new ConstantScoreScorer(score(), scoreMode, iterator); - return new DefaultScorerSupplier(scorer); + return ConstantScoreScorerSupplier.fromIterator( + TwoPhaseIterator.asDocIdSetIterator(iterator), + score(), + scoreMode, + context.reader().maxDoc()); } }; } diff --git a/lucene/core/src/java/org/apache/lucene/document/XYDocValuesPointInGeometryQuery.java b/lucene/core/src/java/org/apache/lucene/document/XYDocValuesPointInGeometryQuery.java index 132a3a36308d..c6e0b41d048e 100644 --- a/lucene/core/src/java/org/apache/lucene/document/XYDocValuesPointInGeometryQuery.java +++ b/lucene/core/src/java/org/apache/lucene/document/XYDocValuesPointInGeometryQuery.java @@ -25,7 +25,7 @@ import org.apache.lucene.index.DocValues; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.SortedNumericDocValues; -import org.apache.lucene.search.ConstantScoreScorer; +import org.apache.lucene.search.ConstantScoreScorerSupplier; import org.apache.lucene.search.ConstantScoreWeight; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; @@ -130,8 +130,11 @@ public float matchCost() { return 1000f; // TODO: what should it be? } }; - final var scorer = new ConstantScoreScorer(boost, scoreMode, iterator); - return new DefaultScorerSupplier(scorer); + return ConstantScoreScorerSupplier.fromIterator( + TwoPhaseIterator.asDocIdSetIterator(iterator), + boost, + scoreMode, + context.reader().maxDoc()); } @Override