Skip to content

Commit de7c91c

Browse files
authored
Use IndexOrDocValuesQuery in NumberFieldType#termQuery implementations (elastic#128293)
1 parent a13a46a commit de7c91c

File tree

10 files changed

+219
-81
lines changed

10 files changed

+219
-81
lines changed

docs/changelog/128293.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 128293
2+
summary: Use `IndexOrDocValuesQuery` in `NumberFieldType#termQuery` implementations
3+
area: Search
4+
type: enhancement
5+
issues: []

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ public boolean isSearchable() {
323323
public Query termQuery(Object value, SearchExecutionContext context) {
324324
failIfNotIndexedNorDocValuesFallback(context);
325325
long scaledValue = Math.round(scale(value));
326-
return NumberFieldMapper.NumberType.LONG.termQuery(name(), scaledValue, isIndexed());
326+
return NumberFieldMapper.NumberType.LONG.termQuery(name(), scaledValue, isIndexed(), hasDocValues());
327327
}
328328

329329
@Override

modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldTypeTests.java

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

1212
import org.apache.lucene.document.Document;
1313
import org.apache.lucene.document.DoublePoint;
14+
import org.apache.lucene.document.LongField;
1415
import org.apache.lucene.document.LongPoint;
1516
import org.apache.lucene.document.SortedNumericDocValuesField;
1617
import org.apache.lucene.index.DirectoryReader;
@@ -47,7 +48,7 @@ public void testTermQuery() {
4748
);
4849
double value = (randomDouble() * 2 - 1) * 10000;
4950
long scaledValue = Math.round(value * ft.getScalingFactor());
50-
assertEquals(LongPoint.newExactQuery("scaled_float", scaledValue), ft.termQuery(value, MOCK_CONTEXT));
51+
assertEquals(LongField.newExactQuery("scaled_float", scaledValue), ft.termQuery(value, MOCK_CONTEXT));
5152

5253
MappedFieldType ft2 = new ScaledFloatFieldMapper.ScaledFloatFieldType("scaled_float", 0.1 + randomDouble() * 100, false);
5354
ElasticsearchException e2 = expectThrows(ElasticsearchException.class, () -> ft2.termQuery("42", MOCK_CONTEXT_DISALLOW_EXPENSIVE));

server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -351,13 +351,19 @@ public Float parse(XContentParser parser, boolean coerce) throws IOException {
351351
}
352352

353353
@Override
354-
public Query termQuery(String field, Object value, boolean isIndexed) {
354+
public Query termQuery(String field, Object value, boolean isIndexed, boolean hasDocValues) {
355355
float v = parseToFloat(value);
356356
if (Float.isFinite(HalfFloatPoint.sortableShortToHalfFloat(HalfFloatPoint.halfFloatToSortableShort(v))) == false) {
357357
return Queries.newMatchNoDocsQuery("Value [" + value + "] is out of range");
358358
}
359359

360360
if (isIndexed) {
361+
if (hasDocValues) {
362+
return new IndexOrDocValuesQuery(
363+
HalfFloatPoint.newExactQuery(field, v),
364+
SortedNumericDocValuesField.newSlowExactQuery(field, HalfFloatPoint.halfFloatToSortableShort(v))
365+
);
366+
}
361367
return HalfFloatPoint.newExactQuery(field, v);
362368
} else {
363369
return SortedNumericDocValuesField.newSlowExactQuery(field, HalfFloatPoint.halfFloatToSortableShort(v));
@@ -541,13 +547,15 @@ public Float parse(XContentParser parser, boolean coerce) throws IOException {
541547
}
542548

543549
@Override
544-
public Query termQuery(String field, Object value, boolean isIndexed) {
550+
public Query termQuery(String field, Object value, boolean isIndexed, boolean hasDocValues) {
545551
float v = parseToFloat(value);
546552
if (Float.isFinite(v) == false) {
547553
return new MatchNoDocsQuery("Value [" + value + "] is out of range");
548554
}
549555

550-
if (isIndexed) {
556+
if (isIndexed && hasDocValues) {
557+
return FloatField.newExactQuery(field, v);
558+
} else if (isIndexed) {
551559
return FloatPoint.newExactQuery(field, v);
552560
} else {
553561
return SortedNumericDocValuesField.newSlowExactQuery(field, NumericUtils.floatToSortableInt(v));
@@ -714,13 +722,15 @@ public FieldValues<Number> compile(String fieldName, Script script, ScriptCompil
714722
}
715723

716724
@Override
717-
public Query termQuery(String field, Object value, boolean isIndexed) {
725+
public Query termQuery(String field, Object value, boolean isIndexed, boolean hasDocValues) {
718726
double v = objectToDouble(value);
719727
if (Double.isFinite(v) == false) {
720728
return Queries.newMatchNoDocsQuery("Value [" + value + "] has a decimal part");
721729
}
722730

723-
if (isIndexed) {
731+
if (isIndexed && hasDocValues) {
732+
return DoubleField.newExactQuery(field, v);
733+
} else if (isIndexed) {
724734
return DoublePoint.newExactQuery(field, v);
725735
} else {
726736
return SortedNumericDocValuesField.newSlowExactQuery(field, NumericUtils.doubleToSortableLong(v));
@@ -874,12 +884,12 @@ public Byte parse(XContentParser parser, boolean coerce) throws IOException {
874884
}
875885

876886
@Override
877-
public Query termQuery(String field, Object value, boolean isIndexed) {
887+
public Query termQuery(String field, Object value, boolean isIndexed, boolean hasDocValues) {
878888
if (isOutOfRange(value)) {
879889
return new MatchNoDocsQuery("Value [" + value + "] is out of range");
880890
}
881891

882-
return INTEGER.termQuery(field, value, isIndexed);
892+
return INTEGER.termQuery(field, value, isIndexed, hasDocValues);
883893
}
884894

885895
@Override
@@ -998,11 +1008,11 @@ public Short parse(XContentParser parser, boolean coerce) throws IOException {
9981008
}
9991009

10001010
@Override
1001-
public Query termQuery(String field, Object value, boolean isIndexed) {
1011+
public Query termQuery(String field, Object value, boolean isIndexed, boolean hasDocValues) {
10021012
if (isOutOfRange(value)) {
10031013
return Queries.newMatchNoDocsQuery("Value [" + value + "] is out of range");
10041014
}
1005-
return INTEGER.termQuery(field, value, isIndexed);
1015+
return INTEGER.termQuery(field, value, isIndexed, hasDocValues);
10061016
}
10071017

10081018
@Override
@@ -1124,7 +1134,7 @@ public Integer parse(XContentParser parser, boolean coerce) throws IOException {
11241134
}
11251135

11261136
@Override
1127-
public Query termQuery(String field, Object value, boolean isIndexed) {
1137+
public Query termQuery(String field, Object value, boolean isIndexed, boolean hasDocValues) {
11281138
if (hasDecimalPart(value)) {
11291139
return Queries.newMatchNoDocsQuery("Value [" + value + "] has a decimal part");
11301140
}
@@ -1135,7 +1145,9 @@ public Query termQuery(String field, Object value, boolean isIndexed) {
11351145
}
11361146
int v = parse(value, true);
11371147

1138-
if (isIndexed) {
1148+
if (isIndexed && hasDocValues) {
1149+
return IntField.newExactQuery(field, v);
1150+
} else if (isIndexed) {
11391151
return IntPoint.newExactQuery(field, v);
11401152
} else {
11411153
return SortedNumericDocValuesField.newSlowExactQuery(field, v);
@@ -1308,7 +1320,7 @@ public FieldValues<Number> compile(String fieldName, Script script, ScriptCompil
13081320
}
13091321

13101322
@Override
1311-
public Query termQuery(String field, Object value, boolean isIndexed) {
1323+
public Query termQuery(String field, Object value, boolean isIndexed, boolean hasDocValues) {
13121324
if (hasDecimalPart(value)) {
13131325
return Queries.newMatchNoDocsQuery("Value [" + value + "] has a decimal part");
13141326
}
@@ -1317,7 +1329,9 @@ public Query termQuery(String field, Object value, boolean isIndexed) {
13171329
}
13181330

13191331
long v = parse(value, true);
1320-
if (isIndexed) {
1332+
if (isIndexed && hasDocValues) {
1333+
return LongField.newExactQuery(field, v);
1334+
} else if (isIndexed) {
13211335
return LongPoint.newExactQuery(field, v);
13221336
} else {
13231337
return SortedNumericDocValuesField.newSlowExactQuery(field, v);
@@ -1500,7 +1514,7 @@ public final TypeParser parser() {
15001514
return parser;
15011515
}
15021516

1503-
public abstract Query termQuery(String field, Object value, boolean isIndexed);
1517+
public abstract Query termQuery(String field, Object value, boolean isIndexed, boolean hasDocValues);
15041518

15051519
public abstract Query termsQuery(String field, Collection<?> values);
15061520

@@ -1891,11 +1905,11 @@ public NumberFieldType(
18911905
}
18921906

18931907
public NumberFieldType(String name, NumberType type) {
1894-
this(name, type, true);
1908+
this(name, type, true, true);
18951909
}
18961910

1897-
public NumberFieldType(String name, NumberType type, boolean isIndexed) {
1898-
this(name, type, isIndexed, false, true, true, null, Collections.emptyMap(), null, false, null, null, false);
1911+
public NumberFieldType(String name, NumberType type, boolean isIndexed, boolean hasDocValues) {
1912+
this(name, type, isIndexed, false, hasDocValues, true, null, Collections.emptyMap(), null, false, null, null, false);
18991913
}
19001914

19011915
@Override
@@ -1934,7 +1948,7 @@ public boolean isSearchable() {
19341948
@Override
19351949
public Query termQuery(Object value, SearchExecutionContext context) {
19361950
failIfNotIndexedNorDocValuesFallback(context);
1937-
return type.termQuery(name(), value, isIndexed());
1951+
return type.termQuery(name(), value, isIndexed(), hasDocValues());
19381952
}
19391953

19401954
@Override

0 commit comments

Comments
 (0)