Skip to content

Commit da2cc5d

Browse files
authored
Replace MappedFieldType isIndexed with finer-grained IndexType (#135892)
The addition of sparse indexes means that our existing isIndexed boolean does not provide enough information to select the best query strategy in several cases. This changes isIndexed to a new IndexType that contains information about the specific type of index structures available for a given field.
1 parent 88a6827 commit da2cc5d

File tree

111 files changed

+694
-525
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

111 files changed

+694
-525
lines changed

benchmarks/src/main/java/org/elasticsearch/benchmark/_nightly/esql/ValuesSourceReaderBenchmark.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.elasticsearch.index.IndexVersion;
5252
import org.elasticsearch.index.mapper.BlockLoader;
5353
import org.elasticsearch.index.mapper.FieldNamesFieldMapper;
54+
import org.elasticsearch.index.mapper.IndexType;
5455
import org.elasticsearch.index.mapper.KeywordFieldMapper;
5556
import org.elasticsearch.index.mapper.MappedFieldType;
5657
import org.elasticsearch.index.mapper.NumberFieldMapper;
@@ -290,9 +291,8 @@ private static BlockLoader numericBlockLoader(WhereAndBaseName w, NumberFieldMap
290291
return new NumberFieldMapper.NumberFieldType(
291292
w.name,
292293
numberType,
293-
true,
294+
IndexType.points(true, docValues),
294295
stored,
295-
docValues,
296296
true,
297297
null,
298298
Map.of(),

benchmarks/src/main/java/org/elasticsearch/benchmark/script/ScriptScoreBenchmark.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.elasticsearch.index.fielddata.FieldDataContext;
3030
import org.elasticsearch.index.fielddata.IndexFieldDataCache;
3131
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
32+
import org.elasticsearch.index.mapper.IndexType;
3233
import org.elasticsearch.index.mapper.MappedFieldType;
3334
import org.elasticsearch.index.mapper.MappingLookup;
3435
import org.elasticsearch.index.mapper.NumberFieldMapper.NumberFieldType;
@@ -85,7 +86,23 @@ public class ScriptScoreBenchmark {
8586
private final ScriptModule scriptModule = new ScriptModule(Settings.EMPTY, pluginsService.filterPlugins(ScriptPlugin.class).toList());
8687

8788
private final Map<String, MappedFieldType> fieldTypes = Map.ofEntries(
88-
Map.entry("n", new NumberFieldType("n", NumberType.LONG, false, false, true, true, null, Map.of(), null, false, null, null, false))
89+
Map.entry(
90+
"n",
91+
new NumberFieldType(
92+
"n",
93+
NumberType.LONG,
94+
IndexType.docValuesOnly(),
95+
false,
96+
true,
97+
null,
98+
Map.of(),
99+
null,
100+
false,
101+
null,
102+
null,
103+
false
104+
)
105+
)
89106
);
90107
private final IndexFieldDataCache fieldDataCache = new IndexFieldDataCache.None();
91108
private final CircuitBreakerService breakerService = new NoneCircuitBreakerService();

modules/data-streams/src/test/java/org/elasticsearch/datastreams/mapper/DataStreamTimestampFieldMapperTests.java

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -252,9 +252,9 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeDisabledDocValuesSkipper
252252
.mappers()
253253
.getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH);
254254
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
255+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
255256
assertTrue(timestampMapper.fieldType().hasDocValues());
256257
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
257-
assertTrue(timestampMapper.fieldType().isIndexed());
258258
}
259259

260260
public void testFieldTypeWithDocValuesSkipper_LogsDBMode() throws IOException {
@@ -274,12 +274,11 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBMode() throws IOException {
274274
assertTrue(timestampMapper.fieldType().hasDocValues());
275275
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
276276
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
277-
assertFalse(timestampMapper.fieldType().isIndexed());
278277
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
279278
} else {
280279
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
281280
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
282-
assertTrue(timestampMapper.fieldType().isIndexed());
281+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
283282
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
284283
}
285284
}
@@ -297,12 +296,11 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeNoTimestampMapping() thr
297296
assertTrue(timestampMapper.fieldType().hasDocValues());
298297
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
299298
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
300-
assertFalse(timestampMapper.fieldType().isIndexed());
301299
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
302300
} else {
303301
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
304302
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
305-
assertTrue(timestampMapper.fieldType().isIndexed());
303+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
306304
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
307305
}
308306
}
@@ -327,12 +325,11 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeTimestampDateNanos() thr
327325
assertTrue(timestampMapper.fieldType().hasDocValues());
328326
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
329327
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
330-
assertFalse(timestampMapper.fieldType().isIndexed());
331328
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
332329
} else {
333330
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
334331
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
335-
assertTrue(timestampMapper.fieldType().isIndexed());
332+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
336333
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
337334
}
338335
}
@@ -355,12 +352,11 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeExplicitTimestampIndexEn
355352
assertTrue(timestampMapper.fieldType().hasDocValues());
356353
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
357354
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
358-
assertFalse(timestampMapper.fieldType().isIndexed());
359355
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
360356
} else {
361357
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
362358
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
363-
assertTrue(timestampMapper.fieldType().isIndexed());
359+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
364360
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
365361
}
366362
}
@@ -384,7 +380,7 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeExplicitTimestampIndexDi
384380
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
385381
assertTrue(timestampMapper.fieldType().hasDocValues());
386382
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
387-
assertTrue(timestampMapper.fieldType().isIndexed());
383+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
388384
}
389385

390386
public void testFieldTypeWithDocValuesSkipper_LogsDBModeWithoutDefaultMapping() throws IOException {
@@ -407,12 +403,11 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeWithoutDefaultMapping()
407403
assertTrue(timestampMapper.fieldType().hasDocValues());
408404
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
409405
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
410-
assertFalse(timestampMapper.fieldType().isIndexed());
411406
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
412407
} else {
413408
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
414409
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
415-
assertTrue(timestampMapper.fieldType().isIndexed());
410+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
416411
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
417412
}
418413
}
@@ -479,12 +474,11 @@ public void testFieldTypeWithDocValuesSkipper_WithoutTimestampSorting() throws I
479474
// NOTE: in LogsDB we always sort on @timestamp (and maybe also on host.name) by default
480475
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
481476
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
482-
assertFalse(timestampMapper.fieldType().isIndexed());
483477
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
484478
} else {
485479
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
486480
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
487-
assertTrue(timestampMapper.fieldType().isIndexed());
481+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
488482
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
489483
}
490484
}
@@ -504,7 +498,7 @@ public void testFieldTypeWithDocValuesSkipper_StandardMode() throws IOException
504498
.getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH);
505499
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
506500
assertTrue(timestampMapper.fieldType().hasDocValues());
507-
assertTrue(timestampMapper.fieldType().isIndexed());
501+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
508502
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
509503
}
510504

@@ -521,20 +515,19 @@ public void testFieldTypeWithDocValuesSkipper_CustomTimestampField() throws IOEx
521515

522516
final DateFieldMapper customTimestamp = (DateFieldMapper) mapperService.documentMapper().mappers().getMapper("timestamp");
523517
assertTrue(customTimestamp.fieldType().hasDocValues());
524-
assertTrue(customTimestamp.fieldType().isIndexed());
518+
assertTrue(customTimestamp.fieldType().indexType().hasPoints());
525519
assertFalse(customTimestamp.fieldType().hasDocValuesSkipper());
526520

527521
// Default LogsDB mapping including @timestamp field is used
528522
final DateFieldMapper defaultTimestamp = (DateFieldMapper) mapperService.documentMapper().mappers().getMapper("@timestamp");
529523
assertTrue(defaultTimestamp.fieldType().hasDocValues());
530524
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
531525
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
532-
assertFalse(defaultTimestamp.fieldType().isIndexed());
533526
assertTrue(defaultTimestamp.fieldType().hasDocValuesSkipper());
534527
} else {
535528
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
536529
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
537-
assertTrue(defaultTimestamp.fieldType().isIndexed());
530+
assertTrue(defaultTimestamp.fieldType().indexType().hasPoints());
538531
assertFalse(defaultTimestamp.fieldType().hasDocValuesSkipper());
539532
}
540533
}
@@ -559,7 +552,7 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeDisabledDocValuesSkipper()
559552
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
560553
assertTrue(timestampMapper.fieldType().hasDocValues());
561554
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
562-
assertTrue(timestampMapper.fieldType().isIndexed());
555+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
563556
}
564557

565558
public void testFieldTypeWithDocValuesSkipper_TSDBMode() throws IOException {
@@ -581,12 +574,11 @@ public void testFieldTypeWithDocValuesSkipper_TSDBMode() throws IOException {
581574
assertTrue(timestampMapper.fieldType().hasDocValues());
582575
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
583576
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
584-
assertFalse(timestampMapper.fieldType().isIndexed());
585577
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
586578
} else {
587579
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
588580
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
589-
assertTrue(timestampMapper.fieldType().isIndexed());
581+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
590582
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
591583
}
592584
}
@@ -606,12 +598,11 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeNoTimestampMapping() throw
606598
assertTrue(timestampMapper.fieldType().hasDocValues());
607599
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
608600
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
609-
assertFalse(timestampMapper.fieldType().isIndexed());
610601
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
611602
} else {
612603
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
613604
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
614-
assertTrue(timestampMapper.fieldType().isIndexed());
605+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
615606
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
616607
}
617608
}
@@ -638,12 +629,11 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeTimestampDateNanos() throw
638629
assertTrue(timestampMapper.fieldType().hasDocValues());
639630
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
640631
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
641-
assertFalse(timestampMapper.fieldType().isIndexed());
642632
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
643633
} else {
644634
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
645635
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
646-
assertTrue(timestampMapper.fieldType().isIndexed());
636+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
647637
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
648638
}
649639
}
@@ -668,12 +658,11 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeExplicitTimestampIndexEnab
668658
assertTrue(timestampMapper.fieldType().hasDocValues());
669659
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
670660
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
671-
assertFalse(timestampMapper.fieldType().isIndexed());
672661
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
673662
} else {
674663
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
675664
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
676-
assertTrue(timestampMapper.fieldType().isIndexed());
665+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
677666
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
678667
}
679668
}
@@ -699,7 +688,7 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeExplicitTimestampIndexDisa
699688
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
700689
assertTrue(timestampMapper.fieldType().hasDocValues());
701690
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
702-
assertTrue(timestampMapper.fieldType().isIndexed());
691+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
703692
}
704693

705694
public void testFieldTypeWithDocValuesSkipper_TSDBModeWithoutDefaultMapping() throws IOException {
@@ -724,12 +713,11 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeWithoutDefaultMapping() th
724713
assertTrue(timestampMapper.fieldType().hasDocValues());
725714
if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) {
726715
assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER);
727-
assertFalse(timestampMapper.fieldType().isIndexed());
728716
assertTrue(timestampMapper.fieldType().hasDocValuesSkipper());
729717
} else {
730718
// TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag
731719
assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false);
732-
assertTrue(timestampMapper.fieldType().isIndexed());
720+
assertTrue(timestampMapper.fieldType().indexType().hasPoints());
733721
assertFalse(timestampMapper.fieldType().hasDocValuesSkipper());
734722
}
735723
}

modules/legacy-geo/src/main/java/org/elasticsearch/legacygeo/mapper/LegacyGeoShapeFieldMapper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.elasticsearch.index.mapper.DocumentParsingException;
3939
import org.elasticsearch.index.mapper.FieldMapper;
4040
import org.elasticsearch.index.mapper.GeoShapeQueryable;
41+
import org.elasticsearch.index.mapper.IndexType;
4142
import org.elasticsearch.index.mapper.MappedFieldType;
4243
import org.elasticsearch.index.mapper.Mapper;
4344
import org.elasticsearch.index.mapper.MapperBuilderContext;
@@ -426,7 +427,7 @@ private GeoShapeFieldType(
426427
LegacyGeoShapeParser parser,
427428
Map<String, String> meta
428429
) {
429-
super(name, indexed, false, false, parser, orientation, meta);
430+
super(name, IndexType.terms(indexed, false), false, parser, orientation, meta);
430431
this.queryProcessor = new LegacyGeoShapeQueryProcessor(this);
431432
}
432433

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.elasticsearch.index.fielddata.IndexFieldData;
2121
import org.elasticsearch.index.mapper.DocumentParserContext;
2222
import org.elasticsearch.index.mapper.FieldMapper;
23+
import org.elasticsearch.index.mapper.IndexType;
2324
import org.elasticsearch.index.mapper.MappedFieldType;
2425
import org.elasticsearch.index.mapper.MapperBuilderContext;
2526
import org.elasticsearch.index.mapper.SourceValueFetcher;
@@ -113,7 +114,7 @@ public static final class RankFeatureFieldType extends MappedFieldType {
113114
private final Float nullValue;
114115

115116
public RankFeatureFieldType(String name, Map<String, String> meta, boolean positiveScoreImpact, Float nullValue) {
116-
super(name, true, false, false, meta);
117+
super(name, IndexType.terms(true, false), false, meta);
117118
this.positiveScoreImpact = positiveScoreImpact;
118119
this.nullValue = nullValue;
119120
}

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeatureMetaFieldMapper.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.index.FieldInfos;
1313
import org.apache.lucene.search.Query;
14+
import org.elasticsearch.index.mapper.IndexType;
1415
import org.elasticsearch.index.mapper.MappedFieldType;
1516
import org.elasticsearch.index.mapper.MetadataFieldMapper;
1617
import org.elasticsearch.index.mapper.ValueFetcher;
@@ -37,7 +38,7 @@ public static final class RankFeatureMetaFieldType extends MappedFieldType {
3738

3839
// made visible for tests
3940
RankFeatureMetaFieldType() {
40-
super(NAME, false, false, false, Collections.emptyMap());
41+
super(NAME, IndexType.NONE, false, Collections.emptyMap());
4142
}
4243

4344
@Override

0 commit comments

Comments
 (0)