Skip to content

Commit 178a7a0

Browse files
authored
Fixes Numeric exact match queries to use range queries internally (#11209)
* Updating numeric term and terms queries to use IODVQ Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Addressing comments Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Fix formatting Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Fix changelog Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Addressing more comments + adding tests Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * renaming yaml test Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Adding skip for bwc Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Adding new SortedUnsignedLongDocValuesSetQuery to allow for BitInteger Terms query Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Fixing some tests Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Remove duplicate skip Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Remove unused points declaration Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Change unsigned exact query to be consistent Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Use slowExactQuery from Unsigned Set Query Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Merging different yaml tests into a single test Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Updating test case for main Signed-off-by: Harsha Vamsi Kalluri <[email protected]> * Fix changelog Signed-off-by: Harsha Vamsi Kalluri <[email protected]> --------- Signed-off-by: Harsha Vamsi Kalluri <[email protected]>
1 parent f647515 commit 178a7a0

File tree

11 files changed

+1795
-131
lines changed

11 files changed

+1795
-131
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
176176
- Performance improvement for date histogram aggregations without sub-aggregations ([#11083](https://github.com/opensearch-project/OpenSearch/pull/11083))
177177
- Disable concurrent aggs for Diversified Sampler and Sampler aggs ([#11087](https://github.com/opensearch-project/OpenSearch/issues/11087))
178178
- Made leader/follower check timeout setting dynamic ([#10528](https://github.com/opensearch-project/OpenSearch/pull/10528))
179+
- Improved performance of numeric exact-match queries ([#11209](https://github.com/opensearch-project/OpenSearch/pull/11209))
179180
- Change error message when per shard document limit is breached ([#11312](https://github.com/opensearch-project/OpenSearch/pull/11312))
180181
- Improve boolean parsing performance ([#11308](https://github.com/opensearch-project/OpenSearch/pull/11308))
181182
- Interpret byte array as primitive using VarHandles ([#11362](https://github.com/opensearch-project/OpenSearch/pull/11362))

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,9 @@ public String typeName() {
199199

200200
@Override
201201
public Query termQuery(Object value, QueryShardContext context) {
202-
failIfNotIndexed();
202+
failIfNotIndexedAndNoDocValues();
203203
long scaledValue = Math.round(scale(value));
204-
Query query = NumberFieldMapper.NumberType.LONG.termQuery(name(), scaledValue);
204+
Query query = NumberFieldMapper.NumberType.LONG.termQuery(name(), scaledValue, hasDocValues(), isSearchable());
205205
if (boost() != 1f) {
206206
query = new BoostQuery(query, boost());
207207
}
@@ -210,13 +210,18 @@ public Query termQuery(Object value, QueryShardContext context) {
210210

211211
@Override
212212
public Query termsQuery(List<?> values, QueryShardContext context) {
213-
failIfNotIndexed();
213+
failIfNotIndexedAndNoDocValues();
214214
List<Long> scaledValues = new ArrayList<>(values.size());
215215
for (Object value : values) {
216216
long scaledValue = Math.round(scale(value));
217217
scaledValues.add(scaledValue);
218218
}
219-
Query query = NumberFieldMapper.NumberType.LONG.termsQuery(name(), Collections.unmodifiableList(scaledValues));
219+
Query query = NumberFieldMapper.NumberType.LONG.termsQuery(
220+
name(),
221+
Collections.unmodifiableList(scaledValues),
222+
hasDocValues(),
223+
isSearchable()
224+
);
220225
if (boost() != 1f) {
221226
query = new BoostQuery(query, boost());
222227
}
@@ -225,7 +230,7 @@ public Query termsQuery(List<?> values, QueryShardContext context) {
225230

226231
@Override
227232
public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, QueryShardContext context) {
228-
failIfNotIndexed();
233+
failIfNotIndexedAndNoDocValues();
229234
Long lo = null;
230235
if (lowerTerm != null) {
231236
double dValue = scale(lowerTerm);
@@ -242,7 +247,7 @@ public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower
242247
}
243248
hi = Math.round(Math.floor(dValue));
244249
}
245-
Query query = NumberFieldMapper.NumberType.LONG.rangeQuery(name(), lo, hi, true, true, hasDocValues(), context);
250+
Query query = NumberFieldMapper.NumberType.LONG.rangeQuery(name(), lo, hi, true, true, hasDocValues(), isSearchable(), context);
246251
if (boost() != 1f) {
247252
query = new BoostQuery(query, boost());
248253
}

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@
3434

3535
import org.apache.lucene.document.Document;
3636
import org.apache.lucene.document.DoublePoint;
37+
import org.apache.lucene.document.LongField;
3738
import org.apache.lucene.document.LongPoint;
3839
import org.apache.lucene.document.SortedNumericDocValuesField;
3940
import org.apache.lucene.index.DirectoryReader;
4041
import org.apache.lucene.index.IndexWriter;
4142
import org.apache.lucene.index.IndexWriterConfig;
43+
import org.apache.lucene.search.IndexOrDocValuesQuery;
4244
import org.apache.lucene.search.IndexSearcher;
4345
import org.apache.lucene.search.Query;
4446
import org.apache.lucene.store.Directory;
@@ -63,7 +65,9 @@ public void testTermQuery() {
6365
);
6466
double value = (randomDouble() * 2 - 1) * 10000;
6567
long scaledValue = Math.round(value * ft.getScalingFactor());
66-
assertEquals(LongPoint.newExactQuery("scaled_float", scaledValue), ft.termQuery(value, null));
68+
Query dvQuery = SortedNumericDocValuesField.newSlowExactQuery("scaled_float", scaledValue);
69+
Query query = new IndexOrDocValuesQuery(LongPoint.newExactQuery("scaled_float", scaledValue), dvQuery);
70+
assertEquals(query, ft.termQuery(value, null));
6771
}
6872

6973
public void testTermsQuery() {
@@ -75,7 +79,7 @@ public void testTermsQuery() {
7579
long scaledValue1 = Math.round(value1 * ft.getScalingFactor());
7680
double value2 = (randomDouble() * 2 - 1) * 10000;
7781
long scaledValue2 = Math.round(value2 * ft.getScalingFactor());
78-
assertEquals(LongPoint.newSetQuery("scaled_float", scaledValue1, scaledValue2), ft.termsQuery(Arrays.asList(value1, value2), null));
82+
assertEquals(LongField.newSetQuery("scaled_float", scaledValue1, scaledValue2), ft.termsQuery(Arrays.asList(value1, value2), null));
7983
}
8084

8185
public void testRangeQuery() throws IOException {
@@ -112,7 +116,16 @@ public void testRangeQuery() throws IOException {
112116
Double u = randomBoolean() ? null : (randomDouble() * 2 - 1) * 10000;
113117
boolean includeLower = randomBoolean();
114118
boolean includeUpper = randomBoolean();
115-
Query doubleQ = NumberFieldMapper.NumberType.DOUBLE.rangeQuery("double", l, u, includeLower, includeUpper, false, MOCK_QSC);
119+
Query doubleQ = NumberFieldMapper.NumberType.DOUBLE.rangeQuery(
120+
"double",
121+
l,
122+
u,
123+
includeLower,
124+
includeUpper,
125+
false,
126+
true,
127+
MOCK_QSC
128+
);
116129
Query scaledFloatQ = ft.rangeQuery(l, u, includeLower, includeUpper, MOCK_QSC);
117130
assertEquals(searcher.count(doubleQ), searcher.count(scaledFloatQ));
118131
}

0 commit comments

Comments
 (0)