Skip to content

Commit a71d64a

Browse files
LuXugangjpountz
andauthored
Skip docs with Docvalues in NumericLeafComparator (#12405)
* Skip document by docValues *When the queue is full with only one Comparator, we could better tune the maxValueAsBytes/minValueAsBytes. For instance, if the sort is ascending and bottom value is 5, we will use a range on [MIN_VALUE, 4]. --------- Co-authored-by: Adrien Grand <[email protected]>
1 parent 8665014 commit a71d64a

35 files changed

+421
-106
lines changed

lucene/CHANGES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,8 @@ Optimizations
262262

263263
* GITHUB#11903: Faster sort on high-cardinality string fields. (Adrien Grand)
264264

265+
* GITHUB#12381: Skip docs with DocValues in NumericLeafComparator. (Lu Xugang, Adrien Grand)
266+
265267
Changes in runtime behavior
266268
---------------------
267269

lucene/core/src/java/org/apache/lucene/document/FeatureSortField.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.lucene.index.Terms;
2424
import org.apache.lucene.index.TermsEnum;
2525
import org.apache.lucene.search.FieldComparator;
26+
import org.apache.lucene.search.Pruning;
2627
import org.apache.lucene.search.SimpleFieldComparator;
2728
import org.apache.lucene.search.SortField;
2829
import org.apache.lucene.util.BytesRef;
@@ -44,7 +45,7 @@ public FeatureSortField(String field, String featureName) {
4445
}
4546

4647
@Override
47-
public FieldComparator<?> getComparator(int numHits, boolean enableSkipping) {
48+
public FieldComparator<?> getComparator(int numHits, Pruning pruning) {
4849
return new FeatureComparator(numHits, getField(), featureName);
4950
}
5051

lucene/core/src/java/org/apache/lucene/document/LatLonPointSortField.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.apache.lucene.geo.GeoUtils;
2020
import org.apache.lucene.search.FieldComparator;
21+
import org.apache.lucene.search.Pruning;
2122
import org.apache.lucene.search.SortField;
2223

2324
/** Sorts by distance from an origin location. */
@@ -38,7 +39,7 @@ final class LatLonPointSortField extends SortField {
3839
}
3940

4041
@Override
41-
public FieldComparator<?> getComparator(int numHits, boolean enableSkipping) {
42+
public FieldComparator<?> getComparator(int numHits, Pruning pruning) {
4243
return new LatLonPointDistanceComparator(getField(), latitude, longitude, numHits);
4344
}
4445

lucene/core/src/java/org/apache/lucene/document/XYPointSortField.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.apache.lucene.document;
1818

1919
import org.apache.lucene.search.FieldComparator;
20+
import org.apache.lucene.search.Pruning;
2021
import org.apache.lucene.search.SortField;
2122

2223
/** Sorts by distance from an origin location. */
@@ -35,7 +36,7 @@ final class XYPointSortField extends SortField {
3536
}
3637

3738
@Override
38-
public FieldComparator<?> getComparator(int numHits, boolean enableSkipping) {
39+
public FieldComparator<?> getComparator(int numHits, Pruning pruning) {
3940
return new XYPointDistanceComparator(getField(), x, y, numHits);
4041
}
4142

lucene/core/src/java/org/apache/lucene/index/CheckIndex.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.apache.lucene.search.FieldExistsQuery;
6161
import org.apache.lucene.search.KnnCollector;
6262
import org.apache.lucene.search.LeafFieldComparator;
63+
import org.apache.lucene.search.Pruning;
6364
import org.apache.lucene.search.Sort;
6465
import org.apache.lucene.search.SortField;
6566
import org.apache.lucene.search.TopDocs;
@@ -1119,7 +1120,7 @@ public static Status.IndexSortStatus testSort(
11191120

11201121
for (int i = 0; i < fields.length; i++) {
11211122
reverseMul[i] = fields[i].getReverse() ? -1 : 1;
1122-
comparators[i] = fields[i].getComparator(1, false).getLeafComparator(readerContext);
1123+
comparators[i] = fields[i].getComparator(1, Pruning.NONE).getLeafComparator(readerContext);
11231124
}
11241125

11251126
int maxDoc = reader.maxDoc();

lucene/core/src/java/org/apache/lucene/search/DoubleValuesSource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -528,8 +528,8 @@ void setMissingValue(double missingValue) {
528528

529529
@Override
530530
public FieldComparator<Double> newComparator(
531-
String fieldname, int numHits, boolean enableSkipping, boolean reversed) {
532-
return new DoubleComparator(numHits, fieldname, missingValue, reversed, false) {
531+
String fieldname, int numHits, Pruning pruning, boolean reversed) {
532+
return new DoubleComparator(numHits, fieldname, missingValue, reversed, Pruning.NONE) {
533533
@Override
534534
public LeafFieldComparator getLeafComparator(LeafReaderContext context) throws IOException {
535535
DoubleValuesHolder holder = new DoubleValuesHolder();

lucene/core/src/java/org/apache/lucene/search/FieldComparatorSource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@ public abstract class FieldComparatorSource {
3030
* @return FieldComparator.
3131
*/
3232
public abstract FieldComparator<?> newComparator(
33-
String fieldname, int numHits, boolean enableSkipping, boolean reversed);
33+
String fieldname, int numHits, Pruning pruning, boolean reversed);
3434
}

lucene/core/src/java/org/apache/lucene/search/FieldValueHitQueue.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ private FieldValueHitQueue(SortField[] fields, int size) {
125125
// need to check it again.
126126

127127
// All these are required by this class's API - need to return arrays.
128-
// Therefore even in the case of a single comparator, create an array
128+
// Therefore, even in the case of a single comparator, create an array
129129
// anyway.
130130
this.fields = fields;
131131
int numComparators = fields.length;
@@ -134,7 +134,12 @@ private FieldValueHitQueue(SortField[] fields, int size) {
134134
for (int i = 0; i < numComparators; ++i) {
135135
SortField field = fields[i];
136136
reverseMul[i] = field.reverse ? -1 : 1;
137-
comparators[i] = field.getComparator(size, i == 0);
137+
comparators[i] =
138+
field.getComparator(
139+
size,
140+
i == 0
141+
? (numComparators > 1 ? Pruning.GREATER_THAN : Pruning.GREATER_THAN_OR_EQUAL_TO)
142+
: Pruning.NONE);
138143
}
139144
}
140145

lucene/core/src/java/org/apache/lucene/search/IndexSortSortedNumericDocValuesRangeQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ private static ValueComparator loadComparator(
608608
throws IOException {
609609
@SuppressWarnings("unchecked")
610610
FieldComparator<Number> fieldComparator =
611-
(FieldComparator<Number>) sortField.getComparator(1, false);
611+
(FieldComparator<Number>) sortField.getComparator(1, Pruning.NONE);
612612
if (type == Type.INT) {
613613
fieldComparator.setTopValue((int) topValue);
614614
} else {

lucene/core/src/java/org/apache/lucene/search/LongValuesSource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,8 +337,8 @@ void setMissingValue(long missingValue) {
337337

338338
@Override
339339
public FieldComparator<Long> newComparator(
340-
String fieldname, int numHits, boolean enableSkipping, boolean reversed) {
341-
return new LongComparator(numHits, fieldname, missingValue, reversed, false) {
340+
String fieldname, int numHits, Pruning pruning, boolean reversed) {
341+
return new LongComparator(numHits, fieldname, missingValue, reversed, Pruning.NONE) {
342342
@Override
343343
public LeafFieldComparator getLeafComparator(LeafReaderContext context) throws IOException {
344344
LongValuesHolder holder = new LongValuesHolder();

0 commit comments

Comments
 (0)