diff --git a/benchmarks/src/main/java/org/elasticsearch/benchmark/_nightly/esql/ValuesSourceReaderBenchmark.java b/benchmarks/src/main/java/org/elasticsearch/benchmark/_nightly/esql/ValuesSourceReaderBenchmark.java index 9cc304828a8a7..bbd58d3309ab6 100644 --- a/benchmarks/src/main/java/org/elasticsearch/benchmark/_nightly/esql/ValuesSourceReaderBenchmark.java +++ b/benchmarks/src/main/java/org/elasticsearch/benchmark/_nightly/esql/ValuesSourceReaderBenchmark.java @@ -51,6 +51,7 @@ import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.mapper.BlockLoader; import org.elasticsearch.index.mapper.FieldNamesFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.NumberFieldMapper; @@ -290,9 +291,8 @@ private static BlockLoader numericBlockLoader(WhereAndBaseName w, NumberFieldMap return new NumberFieldMapper.NumberFieldType( w.name, numberType, - true, + IndexType.points(true, docValues), stored, - docValues, true, null, Map.of(), diff --git a/benchmarks/src/main/java/org/elasticsearch/benchmark/script/ScriptScoreBenchmark.java b/benchmarks/src/main/java/org/elasticsearch/benchmark/script/ScriptScoreBenchmark.java index b94af73a6b5f2..f4edff01c901d 100644 --- a/benchmarks/src/main/java/org/elasticsearch/benchmark/script/ScriptScoreBenchmark.java +++ b/benchmarks/src/main/java/org/elasticsearch/benchmark/script/ScriptScoreBenchmark.java @@ -29,6 +29,7 @@ import org.elasticsearch.index.fielddata.FieldDataContext; import org.elasticsearch.index.fielddata.IndexFieldDataCache; import org.elasticsearch.index.fielddata.IndexNumericFieldData; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MappingLookup; import org.elasticsearch.index.mapper.NumberFieldMapper.NumberFieldType; @@ -85,7 +86,23 @@ public class ScriptScoreBenchmark { private final ScriptModule scriptModule = new ScriptModule(Settings.EMPTY, pluginsService.filterPlugins(ScriptPlugin.class).toList()); private final Map fieldTypes = Map.ofEntries( - Map.entry("n", new NumberFieldType("n", NumberType.LONG, false, false, true, true, null, Map.of(), null, false, null, null, false)) + Map.entry( + "n", + new NumberFieldType( + "n", + NumberType.LONG, + IndexType.docValuesOnly(), + false, + true, + null, + Map.of(), + null, + false, + null, + null, + false + ) + ) ); private final IndexFieldDataCache fieldDataCache = new IndexFieldDataCache.None(); private final CircuitBreakerService breakerService = new NoneCircuitBreakerService(); diff --git a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/mapper/DataStreamTimestampFieldMapperTests.java b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/mapper/DataStreamTimestampFieldMapperTests.java index 652e759515656..a265e69a0a8d6 100644 --- a/modules/data-streams/src/test/java/org/elasticsearch/datastreams/mapper/DataStreamTimestampFieldMapperTests.java +++ b/modules/data-streams/src/test/java/org/elasticsearch/datastreams/mapper/DataStreamTimestampFieldMapperTests.java @@ -252,9 +252,9 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeDisabledDocValuesSkipper .mappers() .getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH); assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertTrue(timestampMapper.fieldType().hasDocValues()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); - assertTrue(timestampMapper.fieldType().isIndexed()); } public void testFieldTypeWithDocValuesSkipper_LogsDBMode() throws IOException { @@ -274,12 +274,11 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBMode() throws IOException { assertTrue(timestampMapper.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } @@ -297,12 +296,11 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeNoTimestampMapping() thr assertTrue(timestampMapper.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } @@ -327,12 +325,11 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeTimestampDateNanos() thr assertTrue(timestampMapper.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } @@ -355,12 +352,11 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeExplicitTimestampIndexEn assertTrue(timestampMapper.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } @@ -384,7 +380,7 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeExplicitTimestampIndexDi assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); assertTrue(timestampMapper.fieldType().hasDocValues()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); } public void testFieldTypeWithDocValuesSkipper_LogsDBModeWithoutDefaultMapping() throws IOException { @@ -407,12 +403,11 @@ public void testFieldTypeWithDocValuesSkipper_LogsDBModeWithoutDefaultMapping() assertTrue(timestampMapper.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } @@ -479,12 +474,11 @@ public void testFieldTypeWithDocValuesSkipper_WithoutTimestampSorting() throws I // NOTE: in LogsDB we always sort on @timestamp (and maybe also on host.name) by default if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } @@ -504,7 +498,7 @@ public void testFieldTypeWithDocValuesSkipper_StandardMode() throws IOException .getMapper(DataStreamTimestampFieldMapper.DEFAULT_PATH); assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); assertTrue(timestampMapper.fieldType().hasDocValues()); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } @@ -521,7 +515,7 @@ public void testFieldTypeWithDocValuesSkipper_CustomTimestampField() throws IOEx final DateFieldMapper customTimestamp = (DateFieldMapper) mapperService.documentMapper().mappers().getMapper("timestamp"); assertTrue(customTimestamp.fieldType().hasDocValues()); - assertTrue(customTimestamp.fieldType().isIndexed()); + assertTrue(customTimestamp.fieldType().indexType().hasPoints()); assertFalse(customTimestamp.fieldType().hasDocValuesSkipper()); // Default LogsDB mapping including @timestamp field is used @@ -529,12 +523,11 @@ public void testFieldTypeWithDocValuesSkipper_CustomTimestampField() throws IOEx assertTrue(defaultTimestamp.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(defaultTimestamp.fieldType().isIndexed()); assertTrue(defaultTimestamp.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(defaultTimestamp.fieldType().isIndexed()); + assertTrue(defaultTimestamp.fieldType().indexType().hasPoints()); assertFalse(defaultTimestamp.fieldType().hasDocValuesSkipper()); } } @@ -559,7 +552,7 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeDisabledDocValuesSkipper() assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); assertTrue(timestampMapper.fieldType().hasDocValues()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); } public void testFieldTypeWithDocValuesSkipper_TSDBMode() throws IOException { @@ -581,12 +574,11 @@ public void testFieldTypeWithDocValuesSkipper_TSDBMode() throws IOException { assertTrue(timestampMapper.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } @@ -606,12 +598,11 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeNoTimestampMapping() throw assertTrue(timestampMapper.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } @@ -638,12 +629,11 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeTimestampDateNanos() throw assertTrue(timestampMapper.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } @@ -668,12 +658,11 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeExplicitTimestampIndexEnab assertTrue(timestampMapper.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } @@ -699,7 +688,7 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeExplicitTimestampIndexDisa assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); assertTrue(timestampMapper.fieldType().hasDocValues()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); } public void testFieldTypeWithDocValuesSkipper_TSDBModeWithoutDefaultMapping() throws IOException { @@ -724,12 +713,11 @@ public void testFieldTypeWithDocValuesSkipper_TSDBModeWithoutDefaultMapping() th assertTrue(timestampMapper.fieldType().hasDocValues()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assumeTrue("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER); - assertFalse(timestampMapper.fieldType().isIndexed()); assertTrue(timestampMapper.fieldType().hasDocValuesSkipper()); } else { // TODO: remove this 'else' branch when removing the `doc_values_skipper` feature flag assumeFalse("doc_values_skipper feature flag enabled", IndexSettings.DOC_VALUES_SKIPPER == false); - assertTrue(timestampMapper.fieldType().isIndexed()); + assertTrue(timestampMapper.fieldType().indexType().hasPoints()); assertFalse(timestampMapper.fieldType().hasDocValuesSkipper()); } } diff --git a/modules/legacy-geo/src/main/java/org/elasticsearch/legacygeo/mapper/LegacyGeoShapeFieldMapper.java b/modules/legacy-geo/src/main/java/org/elasticsearch/legacygeo/mapper/LegacyGeoShapeFieldMapper.java index d2bda8c4cc81c..2ee5b3faa36de 100644 --- a/modules/legacy-geo/src/main/java/org/elasticsearch/legacygeo/mapper/LegacyGeoShapeFieldMapper.java +++ b/modules/legacy-geo/src/main/java/org/elasticsearch/legacygeo/mapper/LegacyGeoShapeFieldMapper.java @@ -38,6 +38,7 @@ import org.elasticsearch.index.mapper.DocumentParsingException; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.GeoShapeQueryable; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperBuilderContext; @@ -426,7 +427,7 @@ private GeoShapeFieldType( LegacyGeoShapeParser parser, Map meta ) { - super(name, indexed, false, false, parser, orientation, meta); + super(name, IndexType.terms(indexed, false), false, parser, orientation, meta); this.queryProcessor = new LegacyGeoShapeQueryProcessor(this); } diff --git a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeatureFieldMapper.java b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeatureFieldMapper.java index cecbb25e16a20..8e4eda87abfb8 100644 --- a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeatureFieldMapper.java +++ b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeatureFieldMapper.java @@ -20,6 +20,7 @@ import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.SourceValueFetcher; @@ -113,7 +114,7 @@ public static final class RankFeatureFieldType extends MappedFieldType { private final Float nullValue; public RankFeatureFieldType(String name, Map meta, boolean positiveScoreImpact, Float nullValue) { - super(name, true, false, false, meta); + super(name, IndexType.terms(true, false), false, meta); this.positiveScoreImpact = positiveScoreImpact; this.nullValue = nullValue; } diff --git a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeatureMetaFieldMapper.java b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeatureMetaFieldMapper.java index 2e45d331aaf7a..755351b0c248b 100644 --- a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeatureMetaFieldMapper.java +++ b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeatureMetaFieldMapper.java @@ -11,6 +11,7 @@ import org.apache.lucene.index.FieldInfos; import org.apache.lucene.search.Query; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MetadataFieldMapper; import org.elasticsearch.index.mapper.ValueFetcher; @@ -37,7 +38,7 @@ public static final class RankFeatureMetaFieldType extends MappedFieldType { // made visible for tests RankFeatureMetaFieldType() { - super(NAME, false, false, false, Collections.emptyMap()); + super(NAME, IndexType.NONE, false, Collections.emptyMap()); } @Override diff --git a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeaturesFieldMapper.java b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeaturesFieldMapper.java index 9496e05bbc161..87963cca91bfc 100644 --- a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeaturesFieldMapper.java +++ b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/RankFeaturesFieldMapper.java @@ -18,6 +18,7 @@ import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.SourceValueFetcher; @@ -80,7 +81,7 @@ public static final class RankFeaturesFieldType extends MappedFieldType { private final boolean positiveScoreImpact; public RankFeaturesFieldType(String name, Map meta, boolean positiveScoreImpact) { - super(name, true, false, false, meta); + super(name, IndexType.terms(true, false), false, meta); this.positiveScoreImpact = positiveScoreImpact; } diff --git a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapper.java b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapper.java index c6f5aa84ae51c..d2bae840b905d 100644 --- a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapper.java +++ b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapper.java @@ -40,6 +40,7 @@ import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.IgnoreMalformedStoredValues; import org.elasticsearch.index.mapper.IgnoredSourceFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.NumberFieldMapper; import org.elasticsearch.index.mapper.SimpleMappedFieldType; @@ -219,11 +220,11 @@ protected Parameter[] getParameters() { @Override public ScaledFloatFieldMapper build(MapperBuilderContext context) { + IndexType indexType = IndexType.points(indexed.get(), hasDocValues.get()); ScaledFloatFieldType type = new ScaledFloatFieldType( context.buildFullName(leafName()), - indexed.getValue(), + indexType, stored.getValue(), - hasDocValues.getValue(), meta.getValue(), scalingFactor.getValue(), nullValue.getValue(), @@ -273,9 +274,8 @@ public static final class ScaledFloatFieldType extends SimpleMappedFieldType { public ScaledFloatFieldType( String name, - boolean indexed, + IndexType indexType, boolean stored, - boolean hasDocValues, Map meta, double scalingFactor, Double nullValue, @@ -284,7 +284,7 @@ public ScaledFloatFieldType( boolean coerce, boolean isSyntheticSource ) { - super(name, indexed, stored, hasDocValues, meta); + super(name, indexType, stored, meta); this.scalingFactor = scalingFactor; this.nullValue = nullValue; this.metricType = metricType; @@ -298,7 +298,7 @@ public ScaledFloatFieldType(String name, double scalingFactor) { } public ScaledFloatFieldType(String name, double scalingFactor, boolean indexed) { - this(name, indexed, false, true, Collections.emptyMap(), scalingFactor, null, null, null, false, false); + this(name, IndexType.points(indexed, true), false, Collections.emptyMap(), scalingFactor, null, null, null, false, false); } public double getScalingFactor() { @@ -317,7 +317,7 @@ public boolean mayExistInIndex(SearchExecutionContext context) { @Override public boolean isSearchable() { - return isIndexed() || hasDocValues(); + return indexType.hasPoints() || hasDocValues(); } @Override @@ -329,13 +329,13 @@ public TextSearchInfo getTextSearchInfo() { public Query termQuery(Object value, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); long scaledValue = Math.round(scale(value)); - return NumberFieldMapper.NumberType.LONG.termQuery(name(), scaledValue, isIndexed()); + return NumberFieldMapper.NumberType.LONG.termQuery(name(), scaledValue, indexType().hasPoints()); } @Override public Query termsQuery(Collection values, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasPoints()) { List scaledValues = new ArrayList<>(values.size()); for (Object value : values) { long scaledValue = Math.round(scale(value)); @@ -372,7 +372,7 @@ public Query rangeQuery( } hi = Math.round(Math.floor(dValue)); } - return NumberFieldMapper.NumberType.LONG.rangeQuery(name(), lo, hi, true, true, hasDocValues(), context, isIndexed()); + return NumberFieldMapper.NumberType.LONG.rangeQuery(name(), lo, hi, true, true, hasDocValues(), context, indexType.hasPoints()); } @Override @@ -399,8 +399,8 @@ public Builder builder(BlockFactory factory, int expectedCount) { } ValueFetcher valueFetcher = sourceValueFetcher(blContext.sourcePaths(name())); - BlockSourceReader.LeafIteratorLookup lookup = hasDocValues() == false && (isStored() || isIndexed()) - // We only write the field names field if there aren't doc values or norms + BlockSourceReader.LeafIteratorLookup lookup = hasDocValues() == false && isStored() + // We only write the field names field if there aren't doc values ? BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name()) : BlockSourceReader.lookupMatchingAll(); return new BlockSourceReader.DoublesBlockLoader(valueFetcher, lookup); @@ -477,7 +477,7 @@ public IndexFieldData.Builder fielddataBuilder(FieldDataContext fieldDataContext (dv, n) -> { throw new UnsupportedOperationException(); }, - isIndexed() + indexType.hasPoints() ).build(cache, breakerService); return new ScaledFloatIndexFieldData(scaledValues, scalingFactor, ScaledFloatDocValuesField::new); }; diff --git a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/TokenCountFieldMapper.java b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/TokenCountFieldMapper.java index a1174c4448315..07bd713799c2a 100644 --- a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/TokenCountFieldMapper.java +++ b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/TokenCountFieldMapper.java @@ -16,6 +16,7 @@ import org.elasticsearch.index.mapper.DocValueFetcher; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.MapperParsingException; @@ -107,9 +108,8 @@ static class TokenCountFieldType extends NumberFieldMapper.NumberFieldType { super( name, NumberFieldMapper.NumberType.INTEGER, - isSearchable, + IndexType.points(isSearchable, hasDocValues), isStored, - hasDocValues, false, nullValue, meta, diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapperTests.java index f1356ac871393..dce105f339a52 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapperTests.java @@ -46,7 +46,6 @@ import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; public class ScaledFloatFieldMapperTests extends NumberFieldMapperTests { @@ -341,7 +340,8 @@ public void testTimeSeriesIndexDefault() throws Exception { })); var ft = (ScaledFloatFieldMapper.ScaledFloatFieldType) mapperService.fieldType("field"); assertThat(ft.getMetricType(), equalTo(randomMetricType)); - assertThat(ft.isIndexed(), is(false)); + assertTrue(ft.hasDocValues()); + assertFalse(ft.indexType().hasDenseIndex()); } @Override diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldTypeTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldTypeTests.java index f2c6f81c3f742..dc089da958c03 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldTypeTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldTypeTests.java @@ -27,6 +27,7 @@ import org.elasticsearch.index.fielddata.LeafNumericFieldData; import org.elasticsearch.index.fielddata.SortedNumericDoubleValues; import org.elasticsearch.index.mapper.FieldTypeTestCase; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.NumberFieldMapper; @@ -88,9 +89,8 @@ public void testRangeQuery() throws IOException { // searching doubles that are rounded to the closest half float ScaledFloatFieldMapper.ScaledFloatFieldType ft = new ScaledFloatFieldMapper.ScaledFloatFieldType( "scaled_float", - randomBoolean(), + IndexType.points(true, randomBoolean()), false, - true, Collections.emptyMap(), 0.1 + randomDouble() * 100, null, diff --git a/modules/percolator/src/main/java/org/elasticsearch/percolator/PercolatorFieldMapper.java b/modules/percolator/src/main/java/org/elasticsearch/percolator/PercolatorFieldMapper.java index 6cd5b527be493..22d0ddfb53a11 100644 --- a/modules/percolator/src/main/java/org/elasticsearch/percolator/PercolatorFieldMapper.java +++ b/modules/percolator/src/main/java/org/elasticsearch/percolator/PercolatorFieldMapper.java @@ -44,6 +44,7 @@ import org.elasticsearch.index.mapper.BinaryFieldMapper; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.LuceneDocument; import org.elasticsearch.index.mapper.MappedFieldType; @@ -239,7 +240,7 @@ static class PercolatorFieldType extends MappedFieldType { boolean mapUnmappedFieldsAsText; private PercolatorFieldType(String name, Map meta) { - super(name, false, false, false, meta); + super(name, IndexType.NONE, false, meta); } @Override diff --git a/plugins/mapper-murmur3/src/main/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapper.java b/plugins/mapper-murmur3/src/main/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapper.java index 4e202e3581e55..c5a61e63f922a 100644 --- a/plugins/mapper-murmur3/src/main/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapper.java +++ b/plugins/mapper-murmur3/src/main/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapper.java @@ -20,6 +20,7 @@ import org.elasticsearch.index.fielddata.plain.SortedNumericIndexFieldData; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.SourceValueFetcher; @@ -68,7 +69,12 @@ public Murmur3FieldMapper build(MapperBuilderContext context) { public static class Murmur3FieldType extends MappedFieldType { private Murmur3FieldType(String name, boolean isStored, Map meta) { - super(name, false, isStored, true, meta); + super(name, IndexType.docValuesOnly(), isStored, meta); + } + + @Override + public boolean isSearchable() { + return false; } @Override @@ -79,7 +85,7 @@ public String typeName() { @Override public IndexFieldData.Builder fielddataBuilder(FieldDataContext fieldDataContext) { failIfNoDocValues(); - return new SortedNumericIndexFieldData.Builder(name(), NumericType.LONG, Murmur3DocValueField::new, isIndexed()); + return new SortedNumericIndexFieldData.Builder(name(), NumericType.LONG, Murmur3DocValueField::new, false); } @Override diff --git a/plugins/mapper-size/src/main/java/org/elasticsearch/index/mapper/size/SizeFieldMapper.java b/plugins/mapper-size/src/main/java/org/elasticsearch/index/mapper/size/SizeFieldMapper.java index 11dbf34f6c791..ccd0b16666a6a 100644 --- a/plugins/mapper-size/src/main/java/org/elasticsearch/index/mapper/size/SizeFieldMapper.java +++ b/plugins/mapper-size/src/main/java/org/elasticsearch/index/mapper/size/SizeFieldMapper.java @@ -13,6 +13,7 @@ import org.elasticsearch.index.mapper.DocValueFetcher; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MetadataFieldMapper; import org.elasticsearch.index.mapper.NumberFieldMapper.NumberFieldType; @@ -50,7 +51,20 @@ public SizeFieldMapper build() { private static class SizeFieldType extends NumberFieldType { SizeFieldType() { - super(NAME, NumberType.INTEGER, true, true, true, false, null, Collections.emptyMap(), null, false, null, null, false); + super( + NAME, + NumberType.INTEGER, + IndexType.points(true, true), + true, + false, + null, + Collections.emptyMap(), + null, + false, + null, + null, + false + ); } @Override diff --git a/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java index 90a6aa06c1bc5..78a8f85f5cf66 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java @@ -136,14 +136,13 @@ public abstract static class AbstractGeometryFieldType extends MappedFieldTyp protected AbstractGeometryFieldType( String name, - boolean indexed, + IndexType indexType, boolean stored, - boolean hasDocValues, Parser geometryParser, T nullValue, Map meta ) { - super(name, indexed, stored, hasDocValues, meta); + super(name, indexType, stored, meta); this.nullValue = nullValue; this.geometryParser = geometryParser; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/AbstractPointGeometryFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/AbstractPointGeometryFieldMapper.java index 0c656624b31ae..d7bc4214ba2cd 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/AbstractPointGeometryFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/AbstractPointGeometryFieldMapper.java @@ -148,14 +148,13 @@ protected void parseAndConsumeFromObject( public abstract static class AbstractPointFieldType extends AbstractGeometryFieldType { protected AbstractPointFieldType( String name, - boolean indexed, + IndexType indexType, boolean stored, - boolean hasDocValues, Parser geometryParser, T nullValue, Map meta ) { - super(name, indexed, stored, hasDocValues, geometryParser, nullValue, meta); + super(name, indexType, stored, geometryParser, nullValue, meta); } @Override diff --git a/server/src/main/java/org/elasticsearch/index/mapper/AbstractScriptFieldType.java b/server/src/main/java/org/elasticsearch/index/mapper/AbstractScriptFieldType.java index 9d2c8e62c7c3a..76d45d682a49f 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/AbstractScriptFieldType.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/AbstractScriptFieldType.java @@ -62,7 +62,7 @@ protected AbstractScriptFieldType( Map meta, boolean isParsedFromSource ) { - super(name, false, false, false, meta); + super(name, IndexType.NONE, false, meta); this.factory = factory; this.script = Objects.requireNonNull(script); this.isResultDeterministic = isResultDeterministic; diff --git a/server/src/main/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapper.java index 03b48e526fd8c..d6ed620fde016 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapper.java @@ -54,14 +54,13 @@ public abstract static class AbstractShapeGeometryFieldType extends AbstractG protected AbstractShapeGeometryFieldType( String name, - boolean isSearchable, + IndexType indexType, boolean isStored, - boolean hasDocValues, Parser parser, Orientation orientation, Map meta ) { - super(name, isSearchable, isStored, hasDocValues, parser, null, meta); + super(name, indexType, isStored, parser, null, meta); this.orientation = orientation; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/BinaryFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/BinaryFieldMapper.java index 80186b18dc7a8..01daf1bf6d392 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/BinaryFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/BinaryFieldMapper.java @@ -83,7 +83,7 @@ public BinaryFieldMapper build(MapperBuilderContext context) { public static final class BinaryFieldType extends MappedFieldType { private BinaryFieldType(String name, boolean isStored, boolean hasDocValues, Map meta) { - super(name, false, isStored, hasDocValues, meta); + super(name, hasDocValues ? IndexType.docValuesOnly() : IndexType.NONE, isStored, meta); } public BinaryFieldType(String name) { diff --git a/server/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java index c0fb9acaf1986..56ff91eef69f0 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java @@ -265,7 +265,7 @@ public String typeName() { @Override public boolean isSearchable() { - return isIndexed() || hasDocValues(); + return indexType.hasTerms() || hasDocValues(); } @Override @@ -365,7 +365,7 @@ public Builder builder(BlockFactory factory, int expectedCount) { } ValueFetcher fetcher = sourceValueFetcher(blContext.sourcePaths(name())); - BlockSourceReader.LeafIteratorLookup lookup = isIndexed() || isStored() + BlockSourceReader.LeafIteratorLookup lookup = indexType.hasTerms() || isStored() ? BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name()) : BlockSourceReader.lookupMatchingAll(); return new BlockSourceReader.BooleansBlockLoader(fetcher, lookup); @@ -450,7 +450,7 @@ public DocValueFormat docValueFormat(@Nullable String format, ZoneId timeZone) { @Override public Query termQuery(Object value, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.termQuery(value, context); } else { return SortedNumericDocValuesField.newSlowExactQuery(name(), docValueForSearch(value)); @@ -460,7 +460,7 @@ public Query termQuery(Object value, SearchExecutionContext context) { @Override public Query termsQuery(Collection values, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.termsQuery(values, context); } else { Set dedupe = new HashSet<>(values); @@ -481,7 +481,7 @@ public Query rangeQuery( SearchExecutionContext context ) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return new TermRangeQuery( name(), lowerTerm == null ? null : indexedValueForSearch(lowerTerm), diff --git a/server/src/main/java/org/elasticsearch/index/mapper/ConstantFieldType.java b/server/src/main/java/org/elasticsearch/index/mapper/ConstantFieldType.java index 6a1d7bd33e053..3f5e2fd5784ff 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/ConstantFieldType.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/ConstantFieldType.java @@ -38,10 +38,15 @@ public abstract class ConstantFieldType extends MappedFieldType { @SuppressWarnings("this-escape") public ConstantFieldType(String name, Map meta) { - super(name, true, false, true, meta); + super(name, IndexType.NONE, false, meta); assert isSearchable(); } + @Override + public boolean isSearchable() { + return true; + } + @Override public final boolean isAggregatable() { return true; diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DataStreamTimestampFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/DataStreamTimestampFieldMapper.java index fe05ba162df78..5dd266183d3bc 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DataStreamTimestampFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DataStreamTimestampFieldMapper.java @@ -49,7 +49,7 @@ public static final class TimestampFieldType extends MappedFieldType { static final TimestampFieldType INSTANCE = new TimestampFieldType(); private TimestampFieldType() { - super(NAME, false, false, false, Map.of()); + super(NAME, IndexType.NONE, false, Map.of()); } @Override @@ -139,7 +139,8 @@ public void doValidate(MappingLookup lookup) { } DateFieldMapper dateFieldMapper = (DateFieldMapper) mapper; - if (dateFieldMapper.fieldType().isIndexed() == false && dateFieldMapper.fieldType().hasDocValuesSkipper() == false) { + IndexType indexType = dateFieldMapper.fieldType().indexType(); + if (indexType.hasPoints() == false && indexType.hasDocValuesSkipper() == false) { throw new IllegalArgumentException("data stream timestamp field [" + DEFAULT_PATH + "] is not indexed"); } if (dateFieldMapper.fieldType().hasDocValues() == false) { diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java index 030c202b08080..cc4ec0c2f8296 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java @@ -418,9 +418,7 @@ private Long parseNullValue(DateFieldType fieldType) { } } - @Override - public DateFieldMapper build(MapperBuilderContext context) { - final String fullFieldName = context.buildFullName(leafName()); + private IndexType indexType(String fullFieldName) { boolean hasDocValuesSkipper = shouldUseDocValuesSkipper( indexCreatedVersion, useDocValuesSkipper, @@ -429,14 +427,23 @@ public DateFieldMapper build(MapperBuilderContext context) { indexSortConfig, fullFieldName ); - boolean hasPoints = hasDocValuesSkipper == false && index.getValue() && indexCreatedVersion.isLegacyIndexVersion() == false; + if (hasDocValuesSkipper) { + return IndexType.skippers(); + } + if (indexCreatedVersion.isLegacyIndexVersion()) { + return IndexType.archivedPoints(); + } + return IndexType.points(index.get(), docValues.get()); + } + + @Override + public DateFieldMapper build(MapperBuilderContext context) { + final String fullFieldName = context.buildFullName(leafName()); + IndexType indexType = indexType(fullFieldName); DateFieldType ft = new DateFieldType( fullFieldName, - hasPoints, - hasDocValuesSkipper == false && index.getValue(), + indexType, store.getValue(), - docValues.getValue(), - hasDocValuesSkipper, context.isSourceSynthetic(), buildFormatter(), resolution, @@ -462,7 +469,7 @@ public DateFieldMapper build(MapperBuilderContext context) { context.isSourceSynthetic(), indexMode, indexSortConfig, - hasDocValuesSkipper, + indexType.hasDocValuesSkipper(), this ); } @@ -504,45 +511,12 @@ public static final class DateFieldType extends MappedFieldType { private final Resolution resolution; private final String nullValue; private final FieldValues scriptValues; - private final boolean pointsMetadataAvailable; - private final boolean hasDocValuesSkipper; private final boolean isSyntheticSource; public DateFieldType( String name, - boolean isIndexed, - boolean pointsMetadataAvailable, - boolean isStored, - boolean hasDocValues, - DateFormatter dateTimeFormatter, - Resolution resolution, - String nullValue, - FieldValues scriptValues, - Map meta - ) { - this( - name, - isIndexed, - pointsMetadataAvailable, - isStored, - hasDocValues, - false, - false, - dateTimeFormatter, - resolution, - nullValue, - scriptValues, - meta - ); - } - - public DateFieldType( - String name, - boolean isIndexed, - boolean pointsMetadataAvailable, + IndexType indexType, boolean isStored, - boolean hasDocValues, - boolean hasDocValuesSkipper, boolean isSyntheticSource, DateFormatter dateTimeFormatter, Resolution resolution, @@ -550,52 +524,32 @@ public DateFieldType( FieldValues scriptValues, Map meta ) { - super(name, isIndexed, isStored, hasDocValues, meta); + super(name, indexType, isStored, meta); this.dateTimeFormatter = dateTimeFormatter; this.dateMathParser = dateTimeFormatter.toDateMathParser(); this.resolution = resolution; this.nullValue = nullValue; this.scriptValues = scriptValues; - this.pointsMetadataAvailable = pointsMetadataAvailable; - this.hasDocValuesSkipper = hasDocValuesSkipper; this.isSyntheticSource = isSyntheticSource; } public DateFieldType( String name, - boolean isIndexed, + IndexType indexType, boolean isStored, - boolean hasDocValues, DateFormatter dateTimeFormatter, Resolution resolution, String nullValue, FieldValues scriptValues, Map meta ) { - this( - name, - isIndexed, - isIndexed, - isStored, - hasDocValues, - false, - false, - dateTimeFormatter, - resolution, - nullValue, - scriptValues, - meta - ); + this(name, indexType, isStored, false, dateTimeFormatter, resolution, nullValue, scriptValues, meta); } public DateFieldType(String name) { this( name, - true, - true, - false, - true, - false, + IndexType.points(true, true), false, DEFAULT_DATE_TIME_FORMATTER, Resolution.MILLISECONDS, @@ -608,11 +562,7 @@ public DateFieldType(String name) { public DateFieldType(String name, boolean isIndexed, Resolution resolution) { this( name, - isIndexed, - isIndexed, - false, - true, - false, + IndexType.points(isIndexed, true), false, DEFAULT_DATE_TIME_FORMATTER, resolution, @@ -627,15 +577,15 @@ public DateFieldType(String name, boolean isIndexed) { } public DateFieldType(String name, DateFormatter dateFormatter) { - this(name, true, true, false, true, false, false, dateFormatter, Resolution.MILLISECONDS, null, null, Collections.emptyMap()); + this(name, IndexType.points(true, true), false, dateFormatter, Resolution.MILLISECONDS, null, null, Collections.emptyMap()); } public DateFieldType(String name, Resolution resolution) { - this(name, true, true, false, true, false, false, DEFAULT_DATE_TIME_FORMATTER, resolution, null, null, Collections.emptyMap()); + this(name, IndexType.points(true, true), false, DEFAULT_DATE_TIME_FORMATTER, resolution, null, null, Collections.emptyMap()); } public DateFieldType(String name, Resolution resolution, DateFormatter dateFormatter) { - this(name, true, true, false, true, false, false, dateFormatter, resolution, null, null, Collections.emptyMap()); + this(name, IndexType.points(true, true), false, dateFormatter, resolution, null, null, Collections.emptyMap()); } @Override @@ -651,7 +601,7 @@ public Resolution resolution() { return resolution; } - protected DateMathParser dateMathParser() { + public DateMathParser dateMathParser() { return dateMathParser; } @@ -661,7 +611,7 @@ public long parse(String value) { } public boolean hasDocValuesSkipper() { - return hasDocValuesSkipper; + return indexType.hasDocValuesSkipper(); } @Override @@ -729,7 +679,7 @@ private String format(long timestamp, DateFormatter formatter) { @Override public boolean isSearchable() { - return isIndexed() || hasDocValues(); + return indexType.hasPoints() || hasDocValues(); } @Override @@ -765,7 +715,7 @@ public Query rangeQuery( name(), (l, u) -> { Query query; - if (isIndexed()) { + if (indexType.hasPoints()) { query = LongPoint.newRangeQuery(name(), l, u); if (hasDocValues()) { Query dvQuery = SortedNumericDocValuesField.newSlowRangeQuery(name(), l, u); @@ -882,7 +832,7 @@ public Query rangeQuery( u = (includeUpper == false) ? upperTerm - 1 : upperTerm; } Query query; - if (isIndexed()) { + if (indexType.hasPoints()) { query = LongPoint.newRangeQuery(name(), l, u); if (hasDocValues()) { Query dvQuery = SortedNumericDocValuesField.newSlowRangeQuery(name(), l, u); @@ -903,8 +853,8 @@ public Query distanceFeatureQuery(Object origin, String pivot, SearchExecutionCo long originLong = parseToLong(origin, true, null, null, context::nowInMillis); TimeValue pivotTime = TimeValue.parseTimeValue(pivot, "distance_feature.pivot"); long pivotLong = resolution.convert(pivotTime); - // As we already apply boost in AbstractQueryBuilder::toQuery, we always passing a boost of 1.0 to distanceFeatureQuery - if (isIndexed()) { + // As we already apply boost in AbstractQueryBuilder::toQuery, we always pass a boost of 1.0 to distanceFeatureQuery + if (indexType.hasPoints()) { return LongField.newDistanceFeatureQuery(name(), 1.0f, originLong, pivotLong); } else { return new LongScriptFieldDistanceFeatureQuery( @@ -928,8 +878,8 @@ public Relation isFieldWithinQuery( DateMathParser dateParser, QueryRewriteContext context ) throws IOException { - if (isIndexed() == false && pointsMetadataAvailable == false && hasDocValues()) { - if (hasDocValuesSkipper() == false) { + if (indexType.hasPointsMetadata() == false && hasDocValues()) { + if (indexType.hasDocValuesSkipper() == false) { // we don't have a quick way to run this check on doc values, so fall back to default assuming we are within bounds return Relation.INTERSECTS; } @@ -1020,7 +970,7 @@ public Relation isFieldWithinQuery( @Override public Function pointReaderIfPossible() { - if (isIndexed()) { + if (indexType.hasPoints()) { return resolution()::parsePointAsMillis; } return null; @@ -1046,7 +996,7 @@ public Builder builder(BlockFactory factory, int expectedCount) { }; } - BlockSourceReader.LeafIteratorLookup lookup = isStored() || isIndexed() + BlockSourceReader.LeafIteratorLookup lookup = isStored() || indexType.hasPoints() ? BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name()) : BlockSourceReader.lookupMatchingAll(); return new BlockSourceReader.LongsBlockLoader(sourceValueFetcher(blContext.sourcePaths(name())), lookup); @@ -1106,7 +1056,7 @@ public IndexFieldData.Builder fielddataBuilder(FieldDataContext fieldDataContext name(), resolution.numericType(), resolution.getDefaultToScriptFieldFactory(), - isIndexed() + indexType.hasPoints() ); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DocCountFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/DocCountFieldMapper.java index d1eee2dfc6a96..216901046fd4d 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DocCountFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DocCountFieldMapper.java @@ -44,7 +44,7 @@ public static final class DocCountFieldType extends MappedFieldType { public static final int DEFAULT_VALUE = 1; public DocCountFieldType() { - super(NAME, false, false, false, Collections.emptyMap()); + super(NAME, IndexType.NONE, false, Collections.emptyMap()); } @Override diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java index 65278533ebe00..b9eb08d6c889c 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java @@ -952,7 +952,7 @@ private static Mapper getLeafMapper(final DocumentParserContext context, String private static FieldMapper noopFieldMapper(String path) { return new FieldMapper( NOOP_FIELD_MAPPER_NAME, - new MappedFieldType(NOOP_FIELD_MAPPER_NAME, false, false, false, Collections.emptyMap()) { + new MappedFieldType(NOOP_FIELD_MAPPER_NAME, IndexType.NONE, false, Collections.emptyMap()) { @Override public ValueFetcher valueFetcher(SearchExecutionContext context, String format) { throw new UnsupportedOperationException(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java index be5c4b82bf1f2..d9865202a0592 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java @@ -218,11 +218,13 @@ public FieldMapper build(MapperBuilderContext context) { metric.get() != TimeSeriesParams.MetricType.POSITION, context.isSourceSynthetic() && ignoreMalformedEnabled ); + IndexType indexType = indexCreatedVersion.isLegacyIndexVersion() + ? IndexType.archivedPoints() + : IndexType.points(indexed.get(), hasDocValues.get()); GeoPointFieldType ft = new GeoPointFieldType( context.buildFullName(leafName()), - indexed.get() && indexCreatedVersion.isLegacyIndexVersion() == false, + indexType, stored.get(), - hasDocValues.get(), geoParser, nullValue.get(), scriptValues(), @@ -292,7 +294,7 @@ public FieldMapper.Builder getMergeBuilder() { @Override protected void index(DocumentParserContext context, GeoPoint geometry) throws IOException { - final boolean indexed = fieldType().isIndexed(); + final boolean indexed = fieldType().indexType.hasPoints(); final boolean hasDocValues = fieldType().hasDocValues(); final boolean store = fieldType().isStored(); if (indexed && hasDocValues) { @@ -389,9 +391,8 @@ public static class GeoPointFieldType extends AbstractPointFieldType i private GeoPointFieldType( String name, - boolean indexed, + IndexType indexType, boolean stored, - boolean hasDocValues, Parser parser, GeoPoint nullValue, FieldValues scriptValues, @@ -400,7 +401,7 @@ private GeoPointFieldType( IndexMode indexMode, boolean isSyntheticSource ) { - super(name, indexed, stored, hasDocValues, parser, nullValue, meta); + super(name, indexType, stored, parser, nullValue, meta); this.scriptValues = scriptValues; this.metricType = metricType; this.indexMode = indexMode; @@ -409,7 +410,7 @@ private GeoPointFieldType( // only used in test public GeoPointFieldType(String name, TimeSeriesParams.MetricType metricType, IndexMode indexMode) { - this(name, true, false, true, null, null, null, Collections.emptyMap(), metricType, indexMode, false); + this(name, IndexType.points(true, true), false, null, null, null, Collections.emptyMap(), metricType, indexMode, false); } // only used in test @@ -424,7 +425,7 @@ public String typeName() { @Override public boolean isSearchable() { - return isIndexed() || hasDocValues(); + return indexType.hasPoints() || hasDocValues(); } @Override @@ -454,7 +455,7 @@ public Query geoShapeQuery(SearchExecutionContext context, String fieldName, Sha luceneRelation = relation.getLuceneRelation(); } Query query; - if (isIndexed()) { + if (indexType.hasPoints()) { query = LatLonPoint.newGeometryQuery(fieldName, luceneRelation, geometries); if (hasDocValues()) { Query dvQuery = LatLonDocValuesField.newSlowGeometryQuery(fieldName, luceneRelation, geometries); @@ -519,7 +520,7 @@ public Query distanceFeatureQuery(Object origin, String pivot, SearchExecutionCo ); } double pivotDouble = DistanceUnit.DEFAULT.parse(pivot, DistanceUnit.DEFAULT); - if (isIndexed()) { + if (indexType.hasPoints()) { // As we already apply boost in AbstractQueryBuilder::toQuery, we always passing a boost of 1.0 to distanceFeatureQuery return LatLonPoint.newDistanceFeatureQuery(name(), 1.0f, originGeoPoint.lat(), originGeoPoint.lon(), pivotDouble); } else { diff --git a/server/src/main/java/org/elasticsearch/index/mapper/IndexType.java b/server/src/main/java/org/elasticsearch/index/mapper/IndexType.java new file mode 100644 index 0000000000000..76e643fed535f --- /dev/null +++ b/server/src/main/java/org/elasticsearch/index/mapper/IndexType.java @@ -0,0 +1,167 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.index.mapper; + +/** + * What type of index structure is available for this field + */ +public class IndexType { + + /** + * An IndexType with no index structures or doc values + */ + public static final IndexType NONE = new IndexType(false, false, false, false, false, false); + + private final boolean hasTerms; + private final boolean hasPoints; + private final boolean hasPointsMetadata; + private final boolean hasVectors; + private final boolean hasDocValues; + private final boolean hasDocValuesSkipper; + + private IndexType( + boolean hasTerms, + boolean hasPoints, + boolean hasPointsMetadata, + boolean hasVectors, + boolean hasDocValues, + boolean hasDocValuesSkipper + ) { + this.hasTerms = hasTerms; + this.hasPoints = hasPoints; + this.hasPointsMetadata = hasPointsMetadata; + this.hasVectors = hasVectors; + this.hasDocValues = hasDocValues; + this.hasDocValuesSkipper = hasDocValuesSkipper; + } + + /** + * @return {@code true} if this IndexType has a Points index + */ + public boolean hasPoints() { + return hasPoints; + } + + /** + * @return {@code true} if this IndexType has Points metadata + */ + public boolean hasPointsMetadata() { + return hasPointsMetadata; + } + + /** + * @return {@code true} if this IndexType has an inverted index + */ + public boolean hasTerms() { + return hasTerms; + } + + /** + * @return {@code true} if this IndexType has a vector index + */ + public boolean hasVectors() { + return hasVectors; + } + + /** + * @return {@code true} if this IndexType has doc values + */ + public boolean hasDocValues() { + return hasDocValues; + } + + /** + * @return {@code true} if this IndexType has a doc values skipper + */ + public boolean hasDocValuesSkipper() { + return hasDocValuesSkipper; + } + + /** + * @return {@code true} if this IndexType has doc values but no index + */ + public boolean hasOnlyDocValues() { + return hasDocValues && hasDenseIndex() == false; + } + + /** + * @return {@code true} if this IndexType has a dense index structure + */ + public boolean hasDenseIndex() { + return hasPoints || hasTerms || hasVectors; + } + + /** + * @return {@code true} if this IndexType has index structures that support sort-based early termination + */ + public boolean supportsSortShortcuts() { + return hasTerms || hasPoints; + } + + /** + * @return an inverted-index based IndexType + */ + public static IndexType terms(boolean isIndexed, boolean hasDocValues) { + if (isIndexed && hasDocValues) { + return new IndexType(true, false, false, false, true, false); + } + if (isIndexed) { + return new IndexType(true, false, false, false, false, false); + } + if (hasDocValues) { + return new IndexType(false, false, false, false, true, false); + } + return NONE; + } + + /** + * @return an IndexType with docValuesSkippers + */ + public static IndexType skippers() { + return new IndexType(false, false, false, false, true, true); + } + + /** + * @return a point-based IndexType + */ + public static IndexType points(boolean isIndexed, boolean hasDocValues) { + if (isIndexed && hasDocValues) { + return new IndexType(false, true, true, false, true, false); + } + if (isIndexed) { + return new IndexType(false, true, true, false, false, false); + } + if (hasDocValues) { + return new IndexType(false, false, false, false, true, false); + } + return NONE; + } + + /** + * @return an IndexType representing archive data, with points metadata extracted from doc values + */ + public static IndexType archivedPoints() { + return new IndexType(false, false, true, false, true, false); + } + + /** + * @return an IndexType with doc values but no index + */ + public static IndexType docValuesOnly() { + return new IndexType(false, false, false, false, true, false); + } + + /** + * @return an IndexType with a vector index + */ + public static IndexType vectors() { + return new IndexType(false, false, false, true, false, false); + } +} diff --git a/server/src/main/java/org/elasticsearch/index/mapper/InferenceMetadataFieldsMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/InferenceMetadataFieldsMapper.java index be6f0b8e39cec..0dc4a39fe2e37 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/InferenceMetadataFieldsMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/InferenceMetadataFieldsMapper.java @@ -65,7 +65,7 @@ public InferenceMetadataFieldType fieldType() { public abstract static class InferenceMetadataFieldType extends MappedFieldType { public InferenceMetadataFieldType() { - super(NAME, false, false, false, Map.of()); + super(NAME, IndexType.NONE, false, Map.of()); } /** diff --git a/server/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java index 26588de38fe54..6db87007747ad 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java @@ -187,6 +187,13 @@ protected Parameter[] getParameters() { dimension }; } + private IndexType indexType() { + if (indexCreatedVersion.isLegacyIndexVersion()) { + return hasDocValues.get() ? IndexType.archivedPoints() : IndexType.NONE; + } + return IndexType.points(indexed.get(), hasDocValues.get()); + } + @Override public IpFieldMapper build(MapperBuilderContext context) { if (inheritDimensionParameterFromParentObject(context)) { @@ -208,9 +215,8 @@ public IpFieldMapper build(MapperBuilderContext context) { leafName(), new IpFieldType( context.buildFullName(leafName()), - indexed.getValue() && indexCreatedVersion.isLegacyIndexVersion() == false, + indexType(), stored.getValue(), - hasDocValues.getValue(), parseNullValue(), scriptValues(), meta.getValue(), @@ -237,23 +243,24 @@ public static final class IpFieldType extends SimpleMappedFieldType { private final FieldValues scriptValues; private final boolean isDimension; private final boolean isSyntheticSource; + private final boolean hasPoints; public IpFieldType( String name, - boolean indexed, + IndexType indexType, boolean stored, - boolean hasDocValues, InetAddress nullValue, FieldValues scriptValues, Map meta, boolean isDimension, boolean isSyntheticSource ) { - super(name, indexed, stored, hasDocValues, meta); + super(name, indexType, stored, meta); this.nullValue = nullValue; this.scriptValues = scriptValues; this.isDimension = isDimension; this.isSyntheticSource = isSyntheticSource; + this.hasPoints = indexType.hasPoints(); } public IpFieldType(String name) { @@ -265,7 +272,7 @@ public IpFieldType(String name, boolean isIndexed) { } public IpFieldType(String name, boolean isIndexed, boolean hasDocValues) { - this(name, isIndexed, false, hasDocValues, null, null, Collections.emptyMap(), false, false); + this(name, IndexType.points(isIndexed, hasDocValues), false, null, null, Collections.emptyMap(), false, false); } @Override @@ -275,7 +282,7 @@ public String typeName() { @Override public boolean isSearchable() { - return isIndexed() || hasDocValues(); + return hasPoints || hasDocValues(); } @Override @@ -350,7 +357,7 @@ public Query termQuery(Object value, @Nullable SearchExecutionContext context) { query = InetAddressPoint.newExactQuery(name(), address); } } - if (isIndexed()) { + if (hasPoints) { return query; } else { return convertToDocValuesQuery(query); @@ -372,7 +379,7 @@ static Query convertToDocValuesQuery(Query query) { @Override public Query termsQuery(Collection values, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed() == false) { + if (hasPoints == false) { return super.termsQuery(values, context); } InetAddress[] addresses = new InetAddress[values.size()]; @@ -408,7 +415,7 @@ public Query rangeQuery( failIfNotIndexedNorDocValuesFallback(context); return rangeQuery(lowerTerm, upperTerm, includeLower, includeUpper, (lower, upper) -> { Query query = InetAddressPoint.newRangeQuery(name(), lower, upper); - if (isIndexed()) { + if (hasPoints) { if (hasDocValues()) { return new IndexOrDocValuesQuery(query, convertToDocValuesQuery(query)); } else { @@ -476,7 +483,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) { } // see #indexValue - BlockSourceReader.LeafIteratorLookup lookup = hasDocValues() == false && isIndexed() + BlockSourceReader.LeafIteratorLookup lookup = hasDocValues() == false && hasPoints ? BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name()) : BlockSourceReader.lookupMatchingAll(); return new BlockSourceReader.IpsBlockLoader(sourceValueFetcher(blContext.sourcePaths(name())), lookup); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java index cf3fad86812f5..89a158cf3bdb4 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java @@ -643,13 +643,13 @@ public KeywordFieldType(String name, NamedAnalyzer analyzer) { @Override public boolean isSearchable() { - return isIndexed() || hasDocValues(); + return indexType.hasTerms() || hasDocValues(); } @Override public Query termQuery(Object value, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.termQuery(value, context); } else { return SortedSetDocValuesField.newSlowExactQuery(name(), indexedValueForSearch(value)); @@ -659,7 +659,7 @@ public Query termQuery(Object value, SearchExecutionContext context) { @Override public Query termsQuery(Collection values, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.termsQuery(values, context); } else { Collection bytesRefs = values.stream().map(this::indexedValueForSearch).toList(); @@ -676,7 +676,7 @@ public Query rangeQuery( SearchExecutionContext context ) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.rangeQuery(lowerTerm, upperTerm, includeLower, includeUpper, context); } else { return SortedSetDocValuesField.newSlowRangeQuery( @@ -700,7 +700,7 @@ public Query fuzzyQuery( @Nullable MultiTermQuery.RewriteMethod rewriteMethod ) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.fuzzyQuery(value, fuzziness, prefixLength, maxExpansions, transpositions, context, rewriteMethod); } else { return StringScriptFieldFuzzyQuery.build( @@ -723,7 +723,7 @@ public Query prefixQuery( SearchExecutionContext context ) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.prefixQuery(value, method, caseInsensitive, context); } else { return new StringScriptFieldPrefixQuery( @@ -739,7 +739,7 @@ public Query prefixQuery( @Override public Query termQueryCaseInsensitive(Object value, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.termQueryCaseInsensitive(value, context); } else { return new StringScriptFieldTermQuery( @@ -755,7 +755,7 @@ public Query termQueryCaseInsensitive(Object value, SearchExecutionContext conte @Override public TermsEnum getTerms(IndexReader reader, String prefix, boolean caseInsensitive, String searchAfter) throws IOException { Terms terms = null; - if (isIndexed()) { + if (indexType.hasTerms()) { terms = MultiTerms.getTerms(reader, name()); } else if (hasDocValues()) { terms = SortedSetDocValuesTerms.getTerms(reader, name()); @@ -862,7 +862,7 @@ private BlockSourceReader.LeafIteratorLookup sourceBlockLoaderLookup(BlockLoader if (getTextSearchInfo().hasNorms()) { return BlockSourceReader.lookupFromNorms(name()); } - if (hasDocValues() == false && (isIndexed() || isStored())) { + if (hasDocValues() == false && (indexType.hasTerms() || isStored())) { // We only write the field names field if there aren't doc values or norms return BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name()); } @@ -989,7 +989,7 @@ public Query wildcardQuery( SearchExecutionContext context ) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.wildcardQuery(value, method, caseInsensitive, true, context); } else { if (getTextSearchInfo().searchAnalyzer() != null) { @@ -1010,7 +1010,7 @@ public Query wildcardQuery( @Override public Query normalizedWildcardQuery(String value, MultiTermQuery.RewriteMethod method, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.normalizedWildcardQuery(value, method, context); } else { if (getTextSearchInfo().searchAnalyzer() != null) { @@ -1038,7 +1038,7 @@ public Query regexpQuery( SearchExecutionContext context ) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasTerms()) { return super.regexpQuery(value, syntaxFlags, matchFlags, maxDeterminizedStates, method, context); } else { if (matchFlags != 0) { diff --git a/server/src/main/java/org/elasticsearch/index/mapper/LookupRuntimeFieldType.java b/server/src/main/java/org/elasticsearch/index/mapper/LookupRuntimeFieldType.java index 4c56e18f181ac..3c3393d4079a6 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/LookupRuntimeFieldType.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/LookupRuntimeFieldType.java @@ -181,7 +181,7 @@ private LookupRuntimeFieldType( String targetField, List fetchFields ) { - super(name, false, false, false, meta); + super(name, IndexType.NONE, false, meta); this.lookupIndex = lookupIndex; this.inputField = inputField; this.targetField = targetField; diff --git a/server/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java b/server/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java index a6f2aef4b35db..771a54afa267a 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java @@ -63,16 +63,14 @@ public abstract class MappedFieldType { private final String name; - private final boolean docValues; - private final boolean isIndexed; + protected final IndexType indexType; private final boolean isStored; private final Map meta; - public MappedFieldType(String name, boolean isIndexed, boolean isStored, boolean hasDocValues, Map meta) { + public MappedFieldType(String name, IndexType indexType, boolean isStored, Map meta) { this.name = Mapper.internFieldName(name); - this.isIndexed = isIndexed; + this.indexType = indexType; this.isStored = isStored; - this.docValues = hasDocValues; // meta should be sorted but for the one item or empty case we can fall back to immutable maps to save some memory since order is // irrelevant this.meta = meta.size() <= 1 ? Map.copyOf(meta) : meta; @@ -121,7 +119,7 @@ public String name() { } public boolean hasDocValues() { - return docValues; + return indexType.hasDocValues(); } /** @@ -144,14 +142,14 @@ public Object valueForDisplay(Object value) { * Returns true if the field is searchable. */ public boolean isSearchable() { - return isIndexed; + return indexType != IndexType.NONE; } /** - * Returns true if the field is indexed. + * Returns the IndexType of this field */ - public final boolean isIndexed() { - return isIndexed; + public final IndexType indexType() { + return indexType; } /** @@ -392,7 +390,7 @@ public Query automatonQuery( } public Query existsQuery(SearchExecutionContext context) { - if (hasDocValues() || (isIndexed() && getTextSearchInfo().hasNorms())) { + if (hasDocValues() || (indexType.hasTerms() && getTextSearchInfo().hasNorms())) { return new FieldExistsQuery(name()); } else { return new TermQuery(new Term(FieldNamesFieldMapper.NAME, name())); @@ -480,21 +478,21 @@ protected final void failIfNoDocValues() { } protected final void failIfNotIndexed() { - if (isIndexed == false) { + if (indexType.hasOnlyDocValues() || indexType == IndexType.NONE) { // we throw an IAE rather than an ISE so that it translates to a 4xx code rather than 5xx code on the http layer throw new IllegalArgumentException("Cannot search on field [" + name() + "] since it is not indexed."); } } protected final void failIfNotIndexedNorDocValuesFallback(SearchExecutionContext context) { - if (docValues == false && context.indexVersionCreated().isLegacyIndexVersion()) { + if (indexType.hasDocValues() == false && context.indexVersionCreated().isLegacyIndexVersion()) { throw new IllegalArgumentException( "Cannot search on field [" + name() + "] of legacy index since it does not have doc values." ); - } else if (isIndexed == false && docValues == false) { + } else if (indexType == IndexType.NONE) { // we throw an IAE rather than an ISE so that it translates to a 4xx code rather than 5xx code on the http layer throw new IllegalArgumentException("Cannot search on field [" + name() + "] since it is not indexed nor has doc values."); - } else if (isIndexed == false && docValues && context.allowExpensiveQueries() == false) { + } else if (indexType.hasOnlyDocValues() && context.allowExpensiveQueries() == false) { // if query can only run using doc values, ensure running expensive queries are allowed throw new ElasticsearchException( "Cannot search on field [" diff --git a/server/src/main/java/org/elasticsearch/index/mapper/MappingLookup.java b/server/src/main/java/org/elasticsearch/index/mapper/MappingLookup.java index 64461d0fd2fd5..93a157f435111 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/MappingLookup.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/MappingLookup.java @@ -538,7 +538,8 @@ public boolean isDataStreamTimestampFieldEnabled() { public boolean hasTimestampField() { final MappedFieldType mappedFieldType = fieldTypesLookup().get(DataStream.TIMESTAMP_FIELD_NAME); if (mappedFieldType instanceof DateFieldMapper.DateFieldType dateMappedFieldType) { - return dateMappedFieldType.hasDocValues() && (dateMappedFieldType.isIndexed() || dateMappedFieldType.hasDocValuesSkipper()); + IndexType indexType = dateMappedFieldType.indexType(); + return indexType.hasPoints() || indexType.hasDocValuesSkipper(); } else { return false; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java index 89757aca89002..6ca488e137d60 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java @@ -239,6 +239,13 @@ public Builder docValues(boolean hasDocValues) { return this; } + private IndexType indexType() { + if (indexCreatedVersion.isLegacyIndexVersion()) { + return IndexType.archivedPoints(); + } + return IndexType.points(indexed.get(), hasDocValues.get()); + } + private FieldValues scriptValues() { if (this.script.get() == null) { return null; @@ -450,7 +457,7 @@ public IndexFieldData.Builder getFieldDataBuilder(MappedFieldType ft, ValuesSour numericType(), valuesSourceType, HalfFloatDocValuesField::new, - ft.isIndexed() + ft.indexType.hasPoints() ); } @@ -644,7 +651,7 @@ public IndexFieldData.Builder getFieldDataBuilder(MappedFieldType ft, ValuesSour numericType(), valuesSourceType, FloatDocValuesField::new, - ft.isIndexed() + ft.indexType.hasPoints() ); } @@ -804,7 +811,7 @@ public IndexFieldData.Builder getFieldDataBuilder(MappedFieldType ft, ValuesSour numericType(), valuesSourceType, DoubleDocValuesField::new, - ft.isIndexed() + ft.indexType.hasPoints() ); } @@ -938,7 +945,7 @@ public IndexFieldData.Builder getFieldDataBuilder(MappedFieldType ft, ValuesSour numericType(), valuesSourceType, ByteDocValuesField::new, - ft.isIndexed() + ft.indexType.hasPoints() ); } @@ -1066,7 +1073,7 @@ public IndexFieldData.Builder getFieldDataBuilder(MappedFieldType ft, ValuesSour numericType(), valuesSourceType, ShortDocValuesField::new, - ft.isIndexed() + ft.indexType.hasPoints() ); } @@ -1268,7 +1275,7 @@ public IndexFieldData.Builder getFieldDataBuilder(MappedFieldType ft, ValuesSour numericType(), valuesSourceType, IntegerDocValuesField::new, - ft.isIndexed() + ft.indexType.hasPoints() ); } @@ -1430,7 +1437,7 @@ public IndexFieldData.Builder getFieldDataBuilder(MappedFieldType ft, ValuesSour numericType(), valuesSourceType, LongDocValuesField::new, - ft.isIndexed() + ft.indexType.hasPoints() ); } @@ -1903,9 +1910,8 @@ public static class NumberFieldType extends SimpleMappedFieldType { public NumberFieldType( String name, NumberType type, - boolean isIndexed, + IndexType indexType, boolean isStored, - boolean hasDocValues, boolean coerce, Number nullValue, Map meta, @@ -1915,7 +1921,7 @@ public NumberFieldType( IndexMode indexMode, boolean isSyntheticSource ) { - super(name, isIndexed, isStored, hasDocValues, meta); + super(name, indexType, isStored, meta); this.type = Objects.requireNonNull(type); this.coerce = coerce; this.nullValue = nullValue; @@ -1930,9 +1936,8 @@ public NumberFieldType( this( name, builder.type, - builder.indexed.getValue() && builder.indexCreatedVersion.isLegacyIndexVersion() == false, + builder.indexType(), builder.stored.getValue(), - builder.hasDocValues.getValue(), builder.coerce.getValue().value(), builder.nullValue.getValue(), builder.meta.getValue(), @@ -1949,7 +1954,7 @@ public NumberFieldType(String name, NumberType type) { } public NumberFieldType(String name, NumberType type, boolean isIndexed) { - this(name, type, isIndexed, false, true, true, null, Collections.emptyMap(), null, false, null, null, false); + this(name, type, IndexType.points(isIndexed, true), false, true, null, Collections.emptyMap(), null, false, null, null, false); } @Override @@ -1987,19 +1992,19 @@ public boolean mayExistInIndex(SearchExecutionContext context) { } public boolean isSearchable() { - return isIndexed() || hasDocValues(); + return indexType.hasPoints() || hasDocValues(); } @Override public Query termQuery(Object value, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - return type.termQuery(name(), value, isIndexed()); + return type.termQuery(name(), value, indexType.hasPoints()); } @Override public Query termsQuery(Collection values, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - if (isIndexed()) { + if (indexType.hasPoints()) { return type.termsQuery(name(), values); } else { return super.termsQuery(values, context); @@ -2015,12 +2020,21 @@ public Query rangeQuery( SearchExecutionContext context ) { failIfNotIndexedNorDocValuesFallback(context); - return type.rangeQuery(name(), lowerTerm, upperTerm, includeLower, includeUpper, hasDocValues(), context, isIndexed()); + return type.rangeQuery( + name(), + lowerTerm, + upperTerm, + includeLower, + includeUpper, + hasDocValues(), + context, + indexType.hasPoints() + ); } @Override public Function pointReaderIfPossible() { - if (isIndexed()) { + if (indexType.hasPoints()) { return this::parsePoint; } return null; @@ -2037,7 +2051,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) { return type.blockLoaderFromFallbackSyntheticSource(name(), nullValue, coerce, blContext); } - BlockSourceReader.LeafIteratorLookup lookup = hasDocValues() == false && (isStored() || isIndexed()) + BlockSourceReader.LeafIteratorLookup lookup = hasDocValues() == false && (isStored() || indexType.hasPoints()) // We only write the field names field if there aren't doc values or norms ? BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name()) : BlockSourceReader.lookupMatchingAll(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/PlaceHolderFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/PlaceHolderFieldMapper.java index adfc70d1e5f80..b1b9db02eb94b 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/PlaceHolderFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/PlaceHolderFieldMapper.java @@ -96,10 +96,10 @@ public PlaceHolderFieldMapper build(MapperBuilderContext context) { public static final class PlaceHolderFieldType extends MappedFieldType { - private String type; + private final String type; public PlaceHolderFieldType(String name, String type, Map meta) { - super(name, false, false, false, meta); + super(name, IndexType.NONE, false, meta); this.type = type; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java index 30c493c49b901..ee891eb6a6c1a 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java @@ -141,9 +141,8 @@ protected RangeFieldType setupFieldType(MapperBuilderContext context) { } return new RangeFieldType( fullName, - index.getValue(), + IndexType.points(index.get(), hasDocValues.get()), store.getValue(), - hasDocValues.getValue(), DateFormatter.forPattern(format.getValue()).withLocale(locale.getValue()), coerce.getValue().value(), meta.getValue() @@ -152,9 +151,8 @@ protected RangeFieldType setupFieldType(MapperBuilderContext context) { if (type == RangeType.DATE) { return new RangeFieldType( fullName, - index.getValue(), + IndexType.points(index.get(), hasDocValues.get()), store.getValue(), - hasDocValues.getValue(), Defaults.DATE_FORMATTER, coerce.getValue().value(), meta.getValue() @@ -163,9 +161,8 @@ protected RangeFieldType setupFieldType(MapperBuilderContext context) { return new RangeFieldType( fullName, type, - index.getValue(), + IndexType.points(index.get(), hasDocValues.get()), store.getValue(), - hasDocValues.getValue(), coerce.getValue().value(), meta.getValue() ); @@ -184,16 +181,8 @@ public static final class RangeFieldType extends MappedFieldType { protected final DateMathParser dateMathParser; protected final boolean coerce; - public RangeFieldType( - String name, - RangeType type, - boolean indexed, - boolean stored, - boolean hasDocValues, - boolean coerce, - Map meta - ) { - super(name, indexed, stored, hasDocValues, meta); + public RangeFieldType(String name, RangeType type, IndexType indexType, boolean stored, boolean coerce, Map meta) { + super(name, indexType, stored, meta); assert type != RangeType.DATE; this.rangeType = Objects.requireNonNull(type); dateTimeFormatter = null; @@ -202,19 +191,18 @@ public RangeFieldType( } public RangeFieldType(String name, RangeType type) { - this(name, type, true, false, true, false, Collections.emptyMap()); + this(name, type, IndexType.points(true, true), false, false, Collections.emptyMap()); } public RangeFieldType( String name, - boolean indexed, + IndexType indexType, boolean stored, - boolean hasDocValues, DateFormatter formatter, boolean coerce, Map meta ) { - super(name, indexed, stored, hasDocValues, meta); + super(name, indexType, stored, meta); this.rangeType = RangeType.DATE; this.dateTimeFormatter = Objects.requireNonNull(formatter); this.dateMathParser = dateTimeFormatter.toDateMathParser(); @@ -222,7 +210,7 @@ public RangeFieldType( } public RangeFieldType(String name, DateFormatter formatter) { - this(name, true, false, true, formatter, false, Collections.emptyMap()); + this(name, IndexType.points(true, true), false, formatter, false, Collections.emptyMap()); } public RangeType rangeType() { diff --git a/server/src/main/java/org/elasticsearch/index/mapper/SeqNoFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/SeqNoFieldMapper.java index 8b9cca8d416cc..134952fc167e5 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/SeqNoFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/SeqNoFieldMapper.java @@ -144,7 +144,7 @@ static final class SeqNoFieldType extends SimpleMappedFieldType { private static final SeqNoFieldType NO_POINT = new SeqNoFieldType(false); private SeqNoFieldType(boolean indexed) { - super(NAME, indexed, false, true, Collections.emptyMap()); + super(NAME, IndexType.points(indexed, true), false, Collections.emptyMap()); } @Override @@ -187,7 +187,7 @@ public ValueFetcher valueFetcher(SearchExecutionContext context, String format) @Override public Query termQuery(Object value, @Nullable SearchExecutionContext context) { long v = parse(value); - if (isIndexed()) { + if (indexType.hasPoints()) { return LongPoint.newExactQuery(name(), v); } else { return NumericDocValuesField.newSlowExactQuery(name(), v); @@ -197,7 +197,7 @@ public Query termQuery(Object value, @Nullable SearchExecutionContext context) { @Override public Query termsQuery(Collection values, @Nullable SearchExecutionContext context) { long[] v = values.stream().mapToLong(SeqNoFieldType::parse).toArray(); - if (isIndexed()) { + if (indexType.hasPoints()) { return LongPoint.newSetQuery(name(), v); } else { return NumericDocValuesField.newSlowSetQuery(name(), v); @@ -232,18 +232,18 @@ public Query rangeQuery( --u; } } - return rangeQueryForSeqNo(isIndexed(), l, u); + return rangeQueryForSeqNo(indexType.hasPoints(), l, u); } @Override public IndexFieldData.Builder fielddataBuilder(FieldDataContext fieldDataContext) { failIfNoDocValues(); - return new SortedNumericIndexFieldData.Builder(name(), NumericType.LONG, SeqNoDocValuesField::new, isIndexed()); + return new SortedNumericIndexFieldData.Builder(name(), NumericType.LONG, SeqNoDocValuesField::new, indexType.hasPoints()); } @Override public boolean isSearchable() { - return isIndexed() || hasDocValues(); + return indexType.hasPoints() || hasDocValues(); } } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/SimpleMappedFieldType.java b/server/src/main/java/org/elasticsearch/index/mapper/SimpleMappedFieldType.java index 2c4ac8b440319..2c6e3acad4596 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/SimpleMappedFieldType.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/SimpleMappedFieldType.java @@ -22,8 +22,8 @@ */ public abstract class SimpleMappedFieldType extends MappedFieldType { - protected SimpleMappedFieldType(String name, boolean isIndexed, boolean isStored, boolean hasDocValues, Map meta) { - super(name, isIndexed, isStored, hasDocValues, meta); + protected SimpleMappedFieldType(String name, IndexType indexType, boolean isStored, Map meta) { + super(name, indexType, isStored, meta); } @Override diff --git a/server/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java index deff0c7db7d11..e8bbfbf5379be 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java @@ -339,7 +339,7 @@ static final class SourceFieldType extends MappedFieldType { private final boolean enabled; private SourceFieldType(boolean enabled) { - super(NAME, false, enabled, false, Collections.emptyMap()); + super(NAME, IndexType.NONE, enabled, Collections.emptyMap()); this.enabled = enabled; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/TermBasedFieldType.java b/server/src/main/java/org/elasticsearch/index/mapper/TermBasedFieldType.java index 598555ba99791..96f1c3fe281d9 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/TermBasedFieldType.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/TermBasedFieldType.java @@ -36,7 +36,7 @@ public TermBasedFieldType( TextSearchInfo textSearchInfo, Map meta ) { - super(name, isIndexed, isStored, hasDocValues, meta); + super(name, IndexType.terms(isIndexed, hasDocValues), isStored, meta); this.textSearchInfo = textSearchInfo; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java index ff7b109577a95..d64c09c9bf196 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java @@ -1030,12 +1030,12 @@ public boolean canUseSyntheticSourceDelegateForLoading() { } /** - * Returns true if the delegate sub-field can be used for querying only (ie. isIndexed must be true) + * Returns true if the delegate sub-field can be used for querying only (ie. isSearchable must be true) */ public boolean canUseSyntheticSourceDelegateForQuerying() { return syntheticSourceDelegate.isPresent() && syntheticSourceDelegate.get().ignoreAbove().isSet() == false - && syntheticSourceDelegate.get().isIndexed(); + && syntheticSourceDelegate.get().isSearchable(); } /** @@ -1050,12 +1050,12 @@ public boolean canUseSyntheticSourceDelegateForSyntheticSource(final String valu } /** - * Returns true if the delegate sub-field can be used for querying only (ie. isIndexed must be true) + * Returns true if the delegate sub-field can be used for querying only (ie. isSearchable must be true) */ public boolean canUseSyntheticSourceDelegateForQueryingEquality(String str) { if (syntheticSourceDelegate.isEmpty() // Can't push equality to an index if there isn't an index - || syntheticSourceDelegate.get().isIndexed() == false + || syntheticSourceDelegate.get().isSearchable() == false // ESQL needs docs values to push equality || syntheticSourceDelegate.get().hasDocValues() == false) { return false; @@ -1174,10 +1174,8 @@ private BlockSourceReader.LeafIteratorLookup blockReaderDisiLookup(BlockLoaderCo return BlockSourceReader.lookupMatchingAll(); } - if (isIndexed()) { - if (getTextSearchInfo().hasNorms()) { - return BlockSourceReader.lookupFromNorms(name()); - } + if (indexType.hasTerms() && getTextSearchInfo().hasNorms()) { + return BlockSourceReader.lookupFromNorms(name()); } else if (isStored() == false) { return BlockSourceReader.lookupMatchingAll(); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/TimeSeriesIdFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/TimeSeriesIdFieldMapper.java index 66eb648ed0a5e..286239d717bd7 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/TimeSeriesIdFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/TimeSeriesIdFieldMapper.java @@ -94,7 +94,7 @@ public TimeSeriesIdFieldMapper build() { public static final class TimeSeriesIdFieldType extends MappedFieldType { private TimeSeriesIdFieldType() { - super(NAME, false, false, true, Collections.emptyMap()); + super(NAME, IndexType.docValuesOnly(), false, Collections.emptyMap()); } @Override @@ -102,6 +102,11 @@ public String typeName() { return CONTENT_TYPE; } + @Override + public boolean isSearchable() { + return false; + } + @Override public ValueFetcher valueFetcher(SearchExecutionContext context, String format) { return new DocValueFetcher(docValueFormat(format, null), context.getForField(this, FielddataOperation.SEARCH)); @@ -158,7 +163,7 @@ private TimeSeriesIdFieldMapper(boolean useDocValuesSkipper) { @Override public void postParse(DocumentParserContext context) throws IOException { - assert fieldType().isIndexed() == false; + assert fieldType().indexType().hasOnlyDocValues(); final BytesRef timeSeriesId; final RoutingPathFields routingPathFields; diff --git a/server/src/main/java/org/elasticsearch/index/mapper/TimeSeriesRoutingHashFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/TimeSeriesRoutingHashFieldMapper.java index 313a43b38a712..47eb3c4b379a5 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/TimeSeriesRoutingHashFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/TimeSeriesRoutingHashFieldMapper.java @@ -77,7 +77,7 @@ public BytesRef parseBytesRef(Object value) { }; private TimeSeriesRoutingHashFieldType() { - super(NAME, false, false, true, Collections.emptyMap()); + super(NAME, IndexType.docValuesOnly(), false, Collections.emptyMap()); } @Override diff --git a/server/src/main/java/org/elasticsearch/index/mapper/VersionFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/VersionFieldMapper.java index 5c1d79816aa7b..3c82591bf9962 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/VersionFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/VersionFieldMapper.java @@ -41,7 +41,7 @@ static final class VersionFieldType extends MappedFieldType { public static final VersionFieldType INSTANCE = new VersionFieldType(); private VersionFieldType() { - super(NAME, false, false, true, Collections.emptyMap()); + super(NAME, IndexType.docValuesOnly(), false, Collections.emptyMap()); } @Override @@ -49,6 +49,11 @@ public String typeName() { return CONTENT_TYPE; } + @Override + public boolean isSearchable() { + return false; + } + @Override public Query termQuery(Object value, SearchExecutionContext context) { throw new QueryShardException(context, "The _version field is not searchable"); @@ -67,7 +72,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) { @Override public IndexFieldData.Builder fielddataBuilder(FieldDataContext fieldDataContext) { failIfNoDocValues(); - return new SortedNumericIndexFieldData.Builder(name(), NumericType.LONG, VersionDocValuesField::new, isIndexed()); + return new SortedNumericIndexFieldData.Builder(name(), NumericType.LONG, VersionDocValuesField::new, false); } } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapper.java index 9b818570ba543..69a520d2bf518 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapper.java @@ -53,6 +53,7 @@ import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.DynamicFieldType; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; @@ -294,7 +295,7 @@ public boolean isDimension() { private KeyedFlattenedFieldType(String rootName, String key, RootFlattenedFieldType ref) { this( rootName, - ref.isIndexed(), + ref.indexType().hasTerms(), ref.hasDocValues(), key, ref.splitQueriesOnWhitespace, @@ -890,7 +891,7 @@ protected void parseCreateField(DocumentParserContext context) throws IOExceptio return; } - if (mappedFieldType.isIndexed() == false && mappedFieldType.hasDocValues() == false) { + if (mappedFieldType.indexType() == IndexType.NONE) { context.parser().skipChildren(); return; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldParser.java b/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldParser.java index 953ac8f7a6941..529e5aac3ea16 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldParser.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldParser.java @@ -168,7 +168,7 @@ private void addField(Context context, ContentPath path, String currentName, Str throw new IllegalArgumentException(msg); } BytesRef bytesValue = new BytesRef(value); - if (fieldType.isIndexed()) { + if (fieldType.indexType().hasTerms()) { fields.add(new StringField(rootFieldFullPath, bytesValue, Field.Store.NO)); fields.add(new StringField(keyedFieldFullPath, bytesKeyedValue, Field.Store.NO)); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java index 5e4012a5e53e1..33d99c5628732 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java @@ -63,6 +63,7 @@ import org.elasticsearch.index.mapper.BlockSourceReader; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperBuilderContext; @@ -2275,7 +2276,7 @@ public DenseVectorFieldType( Map meta, boolean isSyntheticSource ) { - super(name, indexed, false, indexed == false, meta); + super(name, indexed ? IndexType.vectors() : IndexType.docValuesOnly(), false, meta); this.element = Element.getElement(elementType); this.dims = dims; this.indexed = indexed; @@ -2308,6 +2309,11 @@ public DocValueFormat docValueFormat(String format, ZoneId timeZone) { return DocValueFormat.DENSE_VECTOR; } + @Override + public boolean isSearchable() { + return indexed; + } + @Override public boolean isAggregatable() { return false; @@ -2334,7 +2340,7 @@ public Query termQuery(Object value, SearchExecutionContext context) { } public Query createExactKnnQuery(VectorData queryVector, Float vectorSimilarity) { - if (isIndexed() == false) { + if (indexType() == IndexType.NONE) { throw new IllegalArgumentException( "to perform knn search on field [" + name() + "], its mapping must have [index] set to [true]" ); @@ -2401,7 +2407,7 @@ public Query createKnnQuery( FilterHeuristic heuristic, boolean hnswEarlyTermination ) { - if (isIndexed() == false) { + if (indexType.hasVectors() == false) { throw new IllegalArgumentException( "to perform knn search on field [" + name() + "], its mapping must have [index] set to [true]" ); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapper.java index c55bb0b901a24..1b0503aef9d04 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/vectors/SparseVectorFieldMapper.java @@ -34,6 +34,7 @@ import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.FieldNamesFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.MappingParserContext; @@ -224,7 +225,7 @@ public SparseVectorFieldType( Map meta, @Nullable SparseVectorIndexOptions indexOptions ) { - super(name, true, isStored, false, meta); + super(name, IndexType.vectors(), isStored, meta); this.indexVersionCreated = indexVersionCreated; this.indexOptions = indexOptions; } diff --git a/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java index e94ef25aa7822..c2f94c18b5753 100644 --- a/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java +++ b/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java @@ -2404,7 +2404,7 @@ private ShardLongFieldRange determineShardLongFieldRange(String fieldName) { if (mappedFieldType instanceof DateFieldMapper.DateFieldType == false || mappedFieldType.name().equals(fieldName) == false) { return ShardLongFieldRange.UNKNOWN; // field is missing, an alias (as the field type has a different name) or not a date field } - if (mappedFieldType.isIndexed() == false) { + if (mappedFieldType.indexType().hasPoints() == false) { return ShardLongFieldRange.UNKNOWN; // range information missing } diff --git a/server/src/main/java/org/elasticsearch/index/termvectors/TermVectorsService.java b/server/src/main/java/org/elasticsearch/index/termvectors/TermVectorsService.java index 1f7383a947a71..f494fdd0acfab 100644 --- a/server/src/main/java/org/elasticsearch/index/termvectors/TermVectorsService.java +++ b/server/src/main/java/org/elasticsearch/index/termvectors/TermVectorsService.java @@ -183,7 +183,7 @@ private static boolean isValidField(MappedFieldType fieldType) { return false; } // and must be indexed - if (fieldType.isIndexed() == false) { + if (fieldType.indexType().hasTerms() == false) { return false; } // and must not be the nested path field diff --git a/server/src/main/java/org/elasticsearch/lucene/spatial/XYQueriesUtils.java b/server/src/main/java/org/elasticsearch/lucene/spatial/XYQueriesUtils.java index 2441a366c1822..25ef949f9a65a 100644 --- a/server/src/main/java/org/elasticsearch/lucene/spatial/XYQueriesUtils.java +++ b/server/src/main/java/org/elasticsearch/lucene/spatial/XYQueriesUtils.java @@ -26,6 +26,7 @@ import org.elasticsearch.common.geo.LuceneGeometriesUtils; import org.elasticsearch.common.geo.ShapeRelation; import org.elasticsearch.geometry.Geometry; +import org.elasticsearch.index.mapper.IndexType; import java.util.Arrays; @@ -38,7 +39,9 @@ public class XYQueriesUtils { * Note that lucene only supports intersects spatial relation so we build other relations * using just that one. * */ - public static Query toXYPointQuery(Geometry geometry, String fieldName, ShapeRelation relation, boolean indexed, boolean hasDocValues) { + public static Query toXYPointQuery(Geometry geometry, String fieldName, ShapeRelation relation, IndexType indexType) { + boolean indexed = indexType.hasPoints(); + boolean hasDocValues = indexType.hasDocValues(); assert indexed || hasDocValues; final XYGeometry[] luceneGeometries = LuceneGeometriesUtils.toXYGeometry(geometry, t -> {}); // XYPointField only supports intersects query so we build all the relationships using that logic. @@ -285,7 +288,9 @@ public int hashCode() { /** Generates a lucene query for a field that has been previously indexed using {@link XYShape}.It expects * either {code indexed} or {@code has docValues} to be true or both to be true. */ - public static Query toXYShapeQuery(Geometry geometry, String fieldName, ShapeRelation relation, boolean indexed, boolean hasDocValues) { + public static Query toXYShapeQuery(Geometry geometry, String fieldName, ShapeRelation relation, IndexType indexType) { + boolean indexed = indexType.hasPoints(); + boolean hasDocValues = indexType.hasDocValues(); assert indexed || hasDocValues; if (geometry == null || geometry.isEmpty()) { return new MatchNoDocsQuery(); diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/GlobalOrdinalValuesSource.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/GlobalOrdinalValuesSource.java index dcc2ad52cbc50..3de3b0b333e89 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/GlobalOrdinalValuesSource.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/GlobalOrdinalValuesSource.java @@ -104,7 +104,7 @@ boolean mayDynamicallyPrune(IndexReader indexReader) { // If we do not know the field type, the field is not indexed (e.g. runtime field) or the field // has no doc values we should not apply the optimization. - if (fieldType == null || fieldType.isIndexed() == false || fieldType.hasDocValues() == false) { + if (fieldType == null || fieldType.indexType().hasTerms() == false || fieldType.hasDocValues() == false) { return false; } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/SingleDimensionValuesSource.java b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/SingleDimensionValuesSource.java index a71cb6152f818..dd956d7b03926 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/SingleDimensionValuesSource.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/bucket/composite/SingleDimensionValuesSource.java @@ -144,7 +144,7 @@ abstract LeafBucketCollector getLeafCollector(Comparable value, LeafReaderCon * Returns true if a {@link SortedDocsProducer} should be used to optimize the execution. */ protected boolean checkIfSortedDocsIsApplicable(IndexReader reader, MappedFieldType fieldType) { - if (fieldType == null || (missingBucket && afterValue == null) || fieldType.isIndexed() == false || + if (fieldType == null || (missingBucket && afterValue == null) || fieldType.indexType().supportsSortShortcuts() == false || // inverse of the natural order reverseMul == -1) { return false; diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/CoreValuesSourceType.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/CoreValuesSourceType.java index 451eb1b49c737..c711d990eec37 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/CoreValuesSourceType.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/CoreValuesSourceType.java @@ -300,7 +300,7 @@ public Function roundingPreparer(AggregationContext long[] range = new long[] { Long.MIN_VALUE, Long.MAX_VALUE }; // Check the search index for bounds - if (fieldContext.fieldType().isIndexed()) { + if (fieldContext.fieldType().indexType().hasPoints()) { log.trace("Attempting to apply index bound date rounding"); /* * We can't look up the min and max date without both the @@ -319,7 +319,7 @@ public Function roundingPreparer(AggregationContext boolean isMultiValue = false; for (LeafReaderContext leaf : context.searcher().getLeafContexts()) { - if (fieldContext.fieldType().isIndexed()) { + if (fieldContext.fieldType().indexType().hasPoints()) { PointValues pointValues = leaf.reader().getPointValues(fieldContext.field()); if (pointValues != null && pointValues.size() != pointValues.getDocCount()) { isMultiValue = true; diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfig.java b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfig.java index d1d2564812f64..957999d2eae63 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfig.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/support/ValuesSourceConfig.java @@ -429,7 +429,7 @@ public Function getPointReaderOrNull() { * the ordering. */ public boolean alignesWithSearchIndex() { - return script() == null && missing() == null && fieldType() != null && fieldType().isIndexed(); + return script() == null && missing() == null && fieldType() != null && fieldType().indexType().supportsSortShortcuts(); } /** diff --git a/server/src/main/java/org/elasticsearch/search/collapse/CollapseBuilder.java b/server/src/main/java/org/elasticsearch/search/collapse/CollapseBuilder.java index 2b896d4301ac9..e845bfa370222 100644 --- a/server/src/main/java/org/elasticsearch/search/collapse/CollapseBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/collapse/CollapseBuilder.java @@ -214,7 +214,7 @@ public CollapseContext build(SearchExecutionContext searchExecutionContext) { if (fieldType.hasDocValues() == false) { throw new IllegalArgumentException("cannot collapse on field `" + field + "` without `doc_values`"); } - if (fieldType.isIndexed() == false && (innerHits != null && innerHits.isEmpty() == false)) { + if (fieldType.indexType().hasDenseIndex() == false && (innerHits != null && innerHits.isEmpty() == false)) { throw new IllegalArgumentException( "cannot expand `inner_hits` for collapse field `" + field + "`, " + "only indexed field can retrieve `inner_hits`" ); diff --git a/server/src/main/java/org/elasticsearch/search/sort/FieldSortBuilder.java b/server/src/main/java/org/elasticsearch/search/sort/FieldSortBuilder.java index 89250fd8f3f68..8758aa6dfbe1a 100644 --- a/server/src/main/java/org/elasticsearch/search/sort/FieldSortBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/sort/FieldSortBuilder.java @@ -395,7 +395,7 @@ public boolean isBottomSortShardDisjoint(SearchExecutionContext context, SearchS // unmapped return false; } - if (fieldType.isIndexed() == false) { + if (fieldType.indexType().supportsSortShortcuts() == false) { return false; } DocValueFormat docValueFormat = bottomSortValues.getSortValueFormats()[0]; @@ -551,7 +551,7 @@ public static MinAndMax getMinMaxOrNull(SearchExecutionContext context, Field } IndexReader reader = context.getIndexReader(); MappedFieldType fieldType = context.getFieldType(sortField.getField()); - if (reader == null || (fieldType == null || fieldType.isIndexed() == false)) { + if (reader == null || (fieldType == null || fieldType.indexType().supportsSortShortcuts() == false)) { return null; } switch (IndexSortConfig.getSortFieldType(sortField)) { diff --git a/server/src/test/java/org/elasticsearch/index/IndexSortSettingsTests.java b/server/src/test/java/org/elasticsearch/index/IndexSortSettingsTests.java index 478996be08e93..15c18e0206ddd 100644 --- a/server/src/test/java/org/elasticsearch/index/IndexSortSettingsTests.java +++ b/server/src/test/java/org/elasticsearch/index/IndexSortSettingsTests.java @@ -19,6 +19,7 @@ import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.index.fielddata.IndexFieldDataService; import org.elasticsearch.index.mapper.DateFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.TimeSeriesIdFieldMapper; @@ -128,7 +129,7 @@ public void testInvalidMissing() { public void testIndexSortingNoDocValues() { IndexSettings indexSettings = indexSettings(Settings.builder().put("index.sort.field", "field").build()); - MappedFieldType fieldType = new MappedFieldType("field", false, false, false, Collections.emptyMap()) { + MappedFieldType fieldType = new MappedFieldType("field", IndexType.NONE, false, Collections.emptyMap()) { @Override public String typeName() { return null; diff --git a/server/src/test/java/org/elasticsearch/index/fielddata/IndexFieldDataServiceTests.java b/server/src/test/java/org/elasticsearch/index/fielddata/IndexFieldDataServiceTests.java index 31e18f34c4020..7e98b05c8b638 100644 --- a/server/src/test/java/org/elasticsearch/index/fielddata/IndexFieldDataServiceTests.java +++ b/server/src/test/java/org/elasticsearch/index/fielddata/IndexFieldDataServiceTests.java @@ -29,6 +29,7 @@ import org.elasticsearch.index.fielddata.plain.SortedNumericIndexFieldData; import org.elasticsearch.index.fielddata.plain.SortedSetOrdinalsIndexFieldData; import org.elasticsearch.index.mapper.BooleanFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; @@ -320,8 +321,7 @@ public void testRequireDocValuesOnLongs() { new NumberFieldMapper.NumberFieldType( "field", LONG, - true, - false, + IndexType.points(true, false), false, false, null, @@ -341,8 +341,7 @@ public void testRequireDocValuesOnDoubles() { new NumberFieldMapper.NumberFieldType( "field", NumberType.DOUBLE, - true, - false, + IndexType.points(true, false), false, false, null, diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DateFieldTypeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DateFieldTypeTests.java index 735fdd4b9cb3b..a0501908a267f 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DateFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DateFieldTypeTests.java @@ -89,11 +89,7 @@ public void testIsFieldWithinQueryDateNanos() throws IOException { public void testIsFieldWithinQueryDateMillisDocValueSkipper() throws IOException { DateFieldType ft = new DateFieldType( "my_date", - false, - false, - false, - true, - true, + IndexType.skippers(), false, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, Resolution.MILLISECONDS, @@ -107,11 +103,7 @@ public void testIsFieldWithinQueryDateMillisDocValueSkipper() throws IOException public void testIsFieldWithinQueryDateNanosDocValueSkipper() throws IOException { DateFieldType ft = new DateFieldType( "my_date", - false, - false, - false, - true, - true, + IndexType.skippers(), false, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, Resolution.NANOSECONDS, @@ -128,7 +120,7 @@ public void isFieldWithinRangeTestCase(DateFieldType ft) throws IOException { IndexWriter w = new IndexWriter(dir, new IndexWriterConfig(null)); LuceneDocument doc = new LuceneDocument(); Field field; - if (ft.hasDocValuesSkipper()) { + if (ft.indexType.hasDocValuesSkipper()) { field = SortedNumericDocValuesField.indexedField("my_date", ft.parse("2015-10-12")); } else { field = new LongPoint("my_date", ft.parse("2015-10-12")); @@ -546,7 +538,17 @@ public void testDateNanoDocValues() throws IOException { private static DateFieldType fieldType(Resolution resolution, String format, String nullValue) { DateFormatter formatter = DateFormatter.forPattern(format); - return new DateFieldType("field", true, false, true, formatter, resolution, nullValue, null, Collections.emptyMap()); + return new DateFieldType( + "field", + IndexType.points(true, true), + false, + true, + formatter, + resolution, + nullValue, + null, + Collections.emptyMap() + ); } public void testFetchSourceValue() throws IOException { @@ -627,7 +629,7 @@ private SearchExecutionContext prepareIndexForRangeQuery() { private void assertIndexUnsearchable(Resolution resolution, ThrowingConsumer runnable) { DateFieldType unsearchable = new DateFieldType( "field", - false, + IndexType.NONE, false, false, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplatesTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplatesTests.java index 034924e72c7be..9a19898d43711 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplatesTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplatesTests.java @@ -72,10 +72,10 @@ public void testMatchTypeOnly() throws Exception { merge(mapperService, dynamicMapping(parsedDoc.dynamicMappingsUpdate())); assertThat(mapperService.fieldType("s"), notNullValue()); - assertFalse(mapperService.fieldType("s").isIndexed()); + assertThat(mapperService.fieldType("s").indexType(), is(IndexType.NONE)); assertThat(mapperService.fieldType("l"), notNullValue()); - assertTrue(mapperService.fieldType("l").isIndexed()); + assertTrue(mapperService.fieldType("l").indexType().hasPoints()); } public void testUnmatchTypeOnly() throws Exception { @@ -103,10 +103,12 @@ public void testUnmatchTypeOnly() throws Exception { merge(mapperService, dynamicMapping(parsedDoc.dynamicMappingsUpdate())); assertThat(mapperService.fieldType("s"), notNullValue()); - assertTrue(mapperService.fieldType("s").isIndexed()); + var indexType = mapperService.fieldType("s").indexType(); + assertTrue(indexType.hasTerms()); + assertFalse(indexType.hasDocValues()); assertThat(mapperService.fieldType("l"), notNullValue()); - assertFalse(mapperService.fieldType("l").isIndexed()); + assertTrue(mapperService.fieldType("l").indexType().hasOnlyDocValues()); } public void testSimple() throws Exception { diff --git a/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldMapperTests.java index fb73af2102ae2..9ffe1ba394b0b 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldMapperTests.java @@ -46,7 +46,6 @@ import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.hasToString; import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; @@ -164,7 +163,7 @@ public void testTimeSeriesIndexDefault() throws Exception { })); var ft = (GeoPointFieldMapper.GeoPointFieldType) mapperService.fieldType("field"); assertThat(ft.getMetricType(), equalTo(positionMetricType)); - assertThat(ft.isIndexed(), is(false)); + assertTrue(ft.indexType().hasOnlyDocValues()); } public void testMetricAndDocvalues() { @@ -358,7 +357,7 @@ public void testIndexParameter() throws Exception { DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> b.field("type", "geo_point").field("index", false))); Mapper fieldMapper = mapper.mappers().getMapper("field"); assertThat(fieldMapper, instanceOf(GeoPointFieldMapper.class)); - assertThat(((GeoPointFieldMapper) fieldMapper).fieldType().isIndexed(), equalTo(false)); + assertTrue(((GeoPointFieldMapper) fieldMapper).fieldType().indexType().hasOnlyDocValues()); assertThat(((GeoPointFieldMapper) fieldMapper).fieldType().isSearchable(), equalTo(true)); } @@ -545,7 +544,6 @@ protected List exampleMalformedValues() { protected void assertSearchable(MappedFieldType fieldType) { // always searchable even if it uses TextSearchInfo.NONE - assertTrue(fieldType.isIndexed()); assertTrue(fieldType.isSearchable()); } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/IpFieldTypeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/IpFieldTypeTests.java index 895a81a838a9c..3597b14742e27 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/IpFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/IpFieldTypeTests.java @@ -99,8 +99,7 @@ public void testTermQuery() { MappedFieldType unsearchable = new IpFieldMapper.IpFieldType( "field", - false, - false, + IndexType.NONE, false, null, null, @@ -334,8 +333,7 @@ public void testRangeQuery() { MappedFieldType unsearchable = new IpFieldMapper.IpFieldType( "field", - false, - false, + IndexType.NONE, false, null, null, diff --git a/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java index 016d73b880763..29ebb920f6eb0 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java @@ -879,9 +879,7 @@ public void testFieldTypeWithSkipDocValues_LogsDbModeDisabledSetting() throws IO ); final KeywordFieldMapper mapper = (KeywordFieldMapper) mapperService.documentMapper().mappers().getMapper("host.name"); - assertTrue(mapper.fieldType().hasDocValues()); - assertTrue(mapper.fieldType().isIndexed()); - assertFalse(mapper.fieldType().hasDocValuesSkipper()); + assertTrue(mapper.fieldType().indexType().hasTerms()); } public void testFieldTypeWithSkipDocValues_LogsDbMode() throws IOException { @@ -896,12 +894,11 @@ public void testFieldTypeWithSkipDocValues_LogsDbMode() throws IOException { })); final KeywordFieldMapper mapper = (KeywordFieldMapper) mapperService.documentMapper().mappers().getMapper("host.name"); - assertTrue(mapper.fieldType().hasDocValues()); - assertFalse(IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings) && mapper.fieldType().isIndexed()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assertTrue(mapper.fieldType().hasDocValuesSkipper()); } else { assertFalse(mapper.fieldType().hasDocValuesSkipper()); + assertTrue(mapper.fieldType().indexType().hasTerms()); } } @@ -918,7 +915,7 @@ public void testFieldTypeDefault_StandardMode() throws IOException { final KeywordFieldMapper mapper = (KeywordFieldMapper) mapperService.documentMapper().mappers().getMapper("host.name"); assertTrue(mapper.fieldType().hasDocValues()); - assertTrue(mapper.fieldType().isIndexed()); + assertTrue(mapper.fieldType().indexType().hasTerms()); assertFalse(mapper.fieldType().hasDocValuesSkipper()); } @@ -935,7 +932,7 @@ public void testFieldTypeDefault_NonMatchingFieldName() throws IOException { final KeywordFieldMapper mapper = (KeywordFieldMapper) mapperService.documentMapper().mappers().getMapper("hostname"); assertTrue(mapper.fieldType().hasDocValues()); - assertTrue(mapper.fieldType().isIndexed()); + assertTrue(mapper.fieldType().indexType().hasTerms()); assertFalse(mapper.fieldType().hasDocValuesSkipper()); } @@ -953,11 +950,11 @@ public void testFieldTypeDefault_ConfiguredIndexedWithSettingOverride() throws I final KeywordFieldMapper mapper = (KeywordFieldMapper) mapperService.documentMapper().mappers().getMapper("host.name"); assertTrue(mapper.fieldType().hasDocValues()); - assertFalse(IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings) && mapper.fieldType().isIndexed()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assertTrue(mapper.fieldType().hasDocValuesSkipper()); } else { assertFalse(mapper.fieldType().hasDocValuesSkipper()); + assertTrue(mapper.fieldType().indexType().hasTerms()); } } @@ -975,11 +972,11 @@ public void testFieldTypeDefault_ConfiguredIndexedWithoutSettingOverride() throw final KeywordFieldMapper mapper = (KeywordFieldMapper) mapperService.documentMapper().mappers().getMapper("host.name"); assertTrue(mapper.fieldType().hasDocValues()); - assertFalse(IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings) && mapper.fieldType().isIndexed()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assertTrue(mapper.fieldType().hasDocValuesSkipper()); } else { assertFalse(mapper.fieldType().hasDocValuesSkipper()); + assertTrue(mapper.fieldType().indexType().hasTerms()); } } @@ -997,11 +994,11 @@ public void testFieldTypeDefault_ConfiguredDocValues() throws IOException { final KeywordFieldMapper mapper = (KeywordFieldMapper) mapperService.documentMapper().mappers().getMapper("host.name"); assertTrue(mapper.fieldType().hasDocValues()); - assertFalse(IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings) && mapper.fieldType().isIndexed()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assertTrue(mapper.fieldType().hasDocValuesSkipper()); } else { assertFalse(mapper.fieldType().hasDocValuesSkipper()); + assertTrue(mapper.fieldType().indexType().hasTerms()); } } @@ -1018,7 +1015,7 @@ public void testFieldTypeDefault_LogsDbMode_NonSortField() throws IOException { final KeywordFieldMapper mapper = (KeywordFieldMapper) mapperService.documentMapper().mappers().getMapper("host.name"); assertTrue(mapper.fieldType().hasDocValues()); - assertTrue(mapper.fieldType().isIndexed()); + assertTrue(mapper.fieldType().indexType().hasTerms()); assertFalse(mapper.fieldType().hasDocValuesSkipper()); } @@ -1037,11 +1034,11 @@ public void testFieldTypeWithSkipDocValues_IndexedFalseDocValuesTrue() throws IO final KeywordFieldMapper mapper = (KeywordFieldMapper) mapperService.documentMapper().mappers().getMapper("host.name"); assertTrue(mapper.fieldType().hasDocValues()); - assertFalse(IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings) && mapper.fieldType().isIndexed()); if (IndexSettings.USE_DOC_VALUES_SKIPPER.get(settings)) { assertTrue(mapper.fieldType().hasDocValuesSkipper()); } else { assertFalse(mapper.fieldType().hasDocValuesSkipper()); + assertTrue(mapper.fieldType().indexType().hasOnlyDocValues()); } } @@ -1060,7 +1057,7 @@ public void testFieldTypeDefault_IndexedFalseDocValuesFalse() throws IOException final KeywordFieldMapper mapper = (KeywordFieldMapper) mapperService.documentMapper().mappers().getMapper("host.name"); assertFalse(mapper.fieldType().hasDocValues()); - assertFalse(mapper.fieldType().isIndexed()); + assertThat(mapper.fieldType().indexType(), equalTo(IndexType.NONE)); assertFalse(mapper.fieldType().hasDocValuesSkipper()); } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/MappingLookupInferenceFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/MappingLookupInferenceFieldMapperTests.java index 91038d5fbd373..1124dc0758ac1 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/MappingLookupInferenceFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/MappingLookupInferenceFieldMapperTests.java @@ -145,7 +145,7 @@ public FieldMapper build(MapperBuilderContext context) { private static class TestInferenceFieldMapperFieldType extends MappedFieldType { TestInferenceFieldMapperFieldType(String name) { - super(name, false, false, false, Map.of()); + super(name, IndexType.NONE, false, Map.of()); } @Override diff --git a/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldTests.java b/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldTests.java index 3be871db32d40..68b2ef246537e 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldTests.java @@ -70,28 +70,24 @@ public void testMultiFieldMultiFields() throws Exception { assertThat(mapperService.fieldType("name"), notNullValue()); assertThat(mapperService.fieldType("name"), instanceOf(TextFieldType.class)); - assertTrue(mapperService.fieldType("name").isIndexed()); assertTrue(mapperService.fieldType("name").isSearchable()); assertTrue(mapperService.fieldType("name").isStored()); assertTrue(mapperService.fieldType("name").getTextSearchInfo().isTokenized()); assertThat(mapperService.fieldType("name.indexed"), notNullValue()); assertThat(mapperService.fieldType("name"), instanceOf(TextFieldType.class)); - assertTrue(mapperService.fieldType("name.indexed").isIndexed()); assertTrue(mapperService.fieldType("name.indexed").isSearchable()); assertFalse(mapperService.fieldType("name.indexed").isStored()); assertTrue(mapperService.fieldType("name.indexed").getTextSearchInfo().isTokenized()); assertThat(mapperService.fieldType("name.not_indexed"), notNullValue()); assertThat(mapperService.fieldType("name"), instanceOf(TextFieldType.class)); - assertFalse(mapperService.fieldType("name.not_indexed").isIndexed()); assertFalse(mapperService.fieldType("name.not_indexed").isSearchable()); assertTrue(mapperService.fieldType("name.not_indexed").isStored()); assertTrue(mapperService.fieldType("name.not_indexed").getTextSearchInfo().isTokenized()); assertThat(mapperService.fieldType("name.test1"), notNullValue()); assertThat(mapperService.fieldType("name"), instanceOf(TextFieldType.class)); - assertTrue(mapperService.fieldType("name.test1").isIndexed()); assertTrue(mapperService.fieldType("name.test1").isSearchable()); assertTrue(mapperService.fieldType("name.test1").isStored()); assertTrue(mapperService.fieldType("name.test1").getTextSearchInfo().isTokenized()); @@ -101,7 +97,6 @@ public void testMultiFieldMultiFields() throws Exception { assertThat(mapperService.fieldType("object1.multi1"), instanceOf(DateFieldMapper.DateFieldType.class)); assertThat(mapperService.fieldType("object1.multi1.string"), notNullValue()); assertThat(mapperService.fieldType("object1.multi1.string"), instanceOf(KeywordFieldMapper.KeywordFieldType.class)); - assertTrue(mapperService.fieldType("object1.multi1.string").isIndexed()); assertTrue(mapperService.fieldType("object1.multi1.string").isSearchable()); assertNotNull(mapperService.fieldType("object1.multi1.string").getTextSearchInfo()); assertFalse(mapperService.fieldType("object1.multi1.string").getTextSearchInfo().isTokenized()); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/NumberFieldTypeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/NumberFieldTypeTests.java index 38c64ec989117..2b94f469e6c18 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/NumberFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/NumberFieldTypeTests.java @@ -131,8 +131,7 @@ private static MappedFieldType unsearchable() { return new NumberFieldType( "field", NumberType.LONG, - false, - false, + IndexType.NONE, false, true, null, diff --git a/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldTypeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldTypeTests.java index 0492dd1fcc7ce..1f4a8ec3d5a4a 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldTypeTests.java @@ -269,7 +269,14 @@ public void testDateVsDateRangeBounds() { long lower = randomLongBetween(formatter.parseMillis("2000-01-01T00:00"), formatter.parseMillis("2010-01-01T00:00")); long upper = randomLongBetween(formatter.parseMillis("2011-01-01T00:00"), formatter.parseMillis("2020-01-01T00:00")); - RangeFieldType fieldType = new RangeFieldType("field", true, false, false, formatter, false, Collections.emptyMap()); + RangeFieldType fieldType = new RangeFieldType( + "field", + IndexType.points(true, false), + false, + formatter, + false, + Collections.emptyMap() + ); String lowerAsString = formatter.formatMillis(lower); String upperAsString = formatter.formatMillis(upper); // also add date math rounding to days occasionally diff --git a/server/src/test/java/org/elasticsearch/index/mapper/TestRuntimeField.java b/server/src/test/java/org/elasticsearch/index/mapper/TestRuntimeField.java index fcccc184d7639..e9be2f355f19a 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/TestRuntimeField.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/TestRuntimeField.java @@ -56,7 +56,7 @@ public static class TestRuntimeFieldType extends MappedFieldType { private final String type; public TestRuntimeFieldType(String name, String type) { - super(name, false, false, false, Collections.emptyMap()); + super(name, IndexType.NONE, false, Collections.emptyMap()); this.type = type; } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapperTests.java index 66b66c62d8e60..733551d52d6fa 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapperTests.java @@ -34,6 +34,7 @@ import org.elasticsearch.index.codec.vectors.diskbbq.ES920DiskBBQVectorsFormat; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.DocumentParsingException; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.LuceneDocument; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; @@ -1462,7 +1463,11 @@ protected boolean supportsIgnoreMalformed() { @Override protected void assertSearchable(MappedFieldType fieldType) { assertThat(fieldType, instanceOf(DenseVectorFieldType.class)); - assertEquals(fieldType.isIndexed(), indexed); + if (indexed) { + assertTrue(fieldType.indexType().hasVectors()); + } else { + assertThat(fieldType.indexType(), equalTo(IndexType.NONE)); + } assertEquals(fieldType.isSearchable(), indexed); } @@ -2146,7 +2151,7 @@ public void testDefaultParamsBeforeIndexByDefault() throws Exception { DenseVectorFieldMapper denseVectorFieldMapper = (DenseVectorFieldMapper) documentMapper.mappers().getMapper("field"); DenseVectorFieldType denseVectorFieldType = denseVectorFieldMapper.fieldType(); - assertFalse(denseVectorFieldType.isIndexed()); + assertTrue(denseVectorFieldType.indexType().hasOnlyDocValues()); assertNull(denseVectorFieldType.getSimilarity()); } @@ -2157,7 +2162,7 @@ public void testParamsBeforeIndexByDefault() throws Exception { DenseVectorFieldMapper denseVectorFieldMapper = (DenseVectorFieldMapper) documentMapper.mappers().getMapper("field"); DenseVectorFieldType denseVectorFieldType = denseVectorFieldMapper.fieldType(); - assertTrue(denseVectorFieldType.isIndexed()); + assertTrue(denseVectorFieldType.indexType().hasVectors()); assertEquals(VectorSimilarity.DOT_PRODUCT, denseVectorFieldType.getSimilarity()); } @@ -2166,7 +2171,7 @@ public void testDefaultParamsIndexByDefault() throws Exception { DenseVectorFieldMapper denseVectorFieldMapper = (DenseVectorFieldMapper) documentMapper.mappers().getMapper("field"); DenseVectorFieldType denseVectorFieldType = denseVectorFieldMapper.fieldType(); - assertTrue(denseVectorFieldType.isIndexed()); + assertTrue(denseVectorFieldType.indexType().hasVectors()); assertEquals(VectorSimilarity.COSINE, denseVectorFieldType.getSimilarity()); } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldTypeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldTypeTests.java index b55995bea237e..333722a4b438f 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldTypeTests.java @@ -203,11 +203,11 @@ public void testHasDocValues() { assertFalse(bft.hasDocValues()); } - public void testIsIndexed() { + public void testIndexType() { DenseVectorFieldType fft = createFloatFieldType(); - assertEquals(indexed, fft.isIndexed()); + assertEquals(indexed, fft.indexType().hasVectors()); DenseVectorFieldType bft = createByteFieldType(); - assertTrue(bft.isIndexed()); + assertTrue(bft.indexType().hasVectors()); } public void testIsSearchable() { diff --git a/server/src/test/java/org/elasticsearch/lucene/spatial/CartesianPointDocValuesQueryTests.java b/server/src/test/java/org/elasticsearch/lucene/spatial/CartesianPointDocValuesQueryTests.java index 473c1d5b6ddc1..cfb6ed1ceb891 100644 --- a/server/src/test/java/org/elasticsearch/lucene/spatial/CartesianPointDocValuesQueryTests.java +++ b/server/src/test/java/org/elasticsearch/lucene/spatial/CartesianPointDocValuesQueryTests.java @@ -26,6 +26,7 @@ import org.elasticsearch.geo.ShapeTestUtils; import org.elasticsearch.geometry.Geometry; import org.elasticsearch.geometry.Point; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.test.ESTestCase; import java.io.IOException; @@ -62,8 +63,8 @@ public void testIndexSimpleShapes() throws Exception { for (int i = 0; i < 25; i++) { Geometry geometry = ShapeTestUtils.randomGeometry(false); for (ShapeRelation relation : ShapeRelation.values()) { - Query indexQuery = XYQueriesUtils.toXYPointQuery(geometry, FIELD_NAME, relation, true, false); - Query docValQuery = XYQueriesUtils.toXYPointQuery(geometry, FIELD_NAME, relation, false, true); + Query indexQuery = XYQueriesUtils.toXYPointQuery(geometry, FIELD_NAME, relation, IndexType.points(true, false)); + Query docValQuery = XYQueriesUtils.toXYPointQuery(geometry, FIELD_NAME, relation, IndexType.docValuesOnly()); assertQueries(s, indexQuery, docValQuery, numDocs); } } @@ -102,8 +103,8 @@ public void testIndexMultiShapes() throws Exception { for (int i = 0; i < 25; i++) { Geometry geometry = ShapeTestUtils.randomGeometry(false); for (ShapeRelation relation : ShapeRelation.values()) { - Query indexQuery = XYQueriesUtils.toXYPointQuery(geometry, FIELD_NAME, relation, true, false); - Query docValQuery = XYQueriesUtils.toXYPointQuery(geometry, FIELD_NAME, relation, false, true); + Query indexQuery = XYQueriesUtils.toXYPointQuery(geometry, FIELD_NAME, relation, IndexType.points(true, false)); + Query docValQuery = XYQueriesUtils.toXYPointQuery(geometry, FIELD_NAME, relation, IndexType.docValuesOnly()); assertQueries(s, indexQuery, docValQuery, numDocs); } } diff --git a/server/src/test/java/org/elasticsearch/lucene/spatial/CartesianShapeDocValuesQueryTests.java b/server/src/test/java/org/elasticsearch/lucene/spatial/CartesianShapeDocValuesQueryTests.java index cecb1cac12990..aa4036c247771 100644 --- a/server/src/test/java/org/elasticsearch/lucene/spatial/CartesianShapeDocValuesQueryTests.java +++ b/server/src/test/java/org/elasticsearch/lucene/spatial/CartesianShapeDocValuesQueryTests.java @@ -32,6 +32,7 @@ import org.elasticsearch.geo.ShapeTestUtils; import org.elasticsearch.geo.XShapeTestUtil; import org.elasticsearch.geometry.Geometry; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.ShapeIndexer; import org.elasticsearch.test.ESTestCase; @@ -131,8 +132,8 @@ public void testIndexSimpleShapes() throws Exception { for (int i = 0; i < 25; i++) { Geometry geometry = ShapeTestUtils.randomGeometry(false); for (ShapeRelation relation : ShapeRelation.values()) { - Query indexQuery = XYQueriesUtils.toXYShapeQuery(geometry, FIELD_NAME, relation, true, false); - Query docValQuery = XYQueriesUtils.toXYShapeQuery(geometry, FIELD_NAME, relation, false, true); + Query indexQuery = XYQueriesUtils.toXYShapeQuery(geometry, FIELD_NAME, relation, IndexType.points(true, false)); + Query docValQuery = XYQueriesUtils.toXYShapeQuery(geometry, FIELD_NAME, relation, IndexType.docValuesOnly()); assertQueries(s, indexQuery, docValQuery, numDocs); } } @@ -173,8 +174,8 @@ public void testIndexMultiShapes() throws Exception { for (int i = 0; i < 25; i++) { Geometry geometry = ShapeTestUtils.randomGeometry(false); for (ShapeRelation relation : ShapeRelation.values()) { - Query indexQuery = XYQueriesUtils.toXYShapeQuery(geometry, FIELD_NAME, relation, true, false); - Query docValQuery = XYQueriesUtils.toXYShapeQuery(geometry, FIELD_NAME, relation, false, true); + Query indexQuery = XYQueriesUtils.toXYShapeQuery(geometry, FIELD_NAME, relation, IndexType.points(true, false)); + Query docValQuery = XYQueriesUtils.toXYShapeQuery(geometry, FIELD_NAME, relation, IndexType.docValuesOnly()); assertQueries(s, indexQuery, docValQuery, numDocs); } } diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/AggregatorBaseTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/AggregatorBaseTests.java index 230495db7327b..3479b01bca765 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/AggregatorBaseTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/AggregatorBaseTests.java @@ -17,6 +17,7 @@ import org.elasticsearch.common.breaker.CircuitBreaker; import org.elasticsearch.common.util.LongArray; import org.elasticsearch.index.mapper.DateFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.MapperServiceTestCase; @@ -83,9 +84,8 @@ private ValuesSourceConfig getVSConfig( MappedFieldType ft = new NumberFieldMapper.NumberFieldType( fieldName, numType, - indexed, + IndexType.points(indexed, true), false, - true, false, null, Collections.emptyMap(), @@ -106,7 +106,7 @@ private ValuesSourceConfig getVSConfig( ) { MappedFieldType ft = new DateFieldMapper.DateFieldType( fieldName, - indexed, + IndexType.points(indexed, true), false, true, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/filter/FiltersAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/filter/FiltersAggregatorTests.java index 7fb45a12dcffe..0af4a8b31cd76 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/filter/FiltersAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/filter/FiltersAggregatorTests.java @@ -40,6 +40,7 @@ import org.elasticsearch.index.mapper.DateFieldMapper.Resolution; import org.elasticsearch.index.mapper.DocCountFieldMapper; import org.elasticsearch.index.mapper.FieldNamesFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.KeywordFieldMapper.KeywordFieldType; import org.elasticsearch.index.mapper.LuceneDocument; @@ -368,7 +369,7 @@ public void testWithEmptyMergedPointRangeQueries() throws IOException { public void testRangeFilter() throws IOException { MappedFieldType ft = new DateFieldMapper.DateFieldType( "test", - true, + IndexType.points(true, false), false, false, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, @@ -825,7 +826,7 @@ public void testTermOnFilterWithMatchAll() throws IOException { public void testComplexUnionDisabledFilterByFilter() throws IOException { MappedFieldType dft = new DateFieldMapper.DateFieldType( "date", - true, + IndexType.points(true, false), false, false, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, @@ -1215,7 +1216,7 @@ public void testBoolWithMatchAllThenDateFilter() throws IOException { public void testSubAggs() throws IOException { MappedFieldType dateFt = new DateFieldMapper.DateFieldType( "test", - true, + IndexType.points(true, false), false, false, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, @@ -1300,7 +1301,7 @@ public void testSubAggs() throws IOException { public void testSubAggsManyDocs() throws IOException { MappedFieldType dateFt = new DateFieldMapper.DateFieldType( "test", - true, + IndexType.points(true, false), false, false, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, @@ -1371,7 +1372,7 @@ public void testSubAggsManyDocs() throws IOException { public void testSubAggsManyFilters() throws IOException { MappedFieldType dateFt = new DateFieldMapper.DateFieldType( "test", - true, + IndexType.points(true, false), false, false, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, @@ -1482,21 +1483,7 @@ public void testDocValuesFieldExistsForDateWithoutData() throws IOException { public void testDocValuesFieldExistsForNumber() throws IOException { NumberFieldMapper.NumberType numberType = randomFrom(NumberFieldMapper.NumberType.values()); - NumberFieldMapper.NumberFieldType ft = new NumberFieldMapper.NumberFieldType( - "f", - numberType, - true, - false, - true, - true, - null, - Map.of(), - null, - false, - null, - null, - false - ); + NumberFieldMapper.NumberFieldType ft = new NumberFieldMapper.NumberFieldType("f", numberType); docValuesFieldExistsTestCase(new ExistsQueryBuilder("f"), ft, true, i -> { final LuceneDocument document = new LuceneDocument(); numberType.addFields(document, "f", i, true, true, false); @@ -1505,23 +1492,7 @@ public void testDocValuesFieldExistsForNumber() throws IOException { } public void testDocValuesFieldExistsForNumberWithoutData() throws IOException { - docValuesFieldExistsNoDataTestCase( - new NumberFieldMapper.NumberFieldType( - "f", - randomFrom(NumberFieldMapper.NumberType.values()), - true, - false, - true, - true, - null, - Map.of(), - null, - false, - null, - null, - false - ) - ); + docValuesFieldExistsNoDataTestCase(new NumberFieldMapper.NumberFieldType("f", randomFrom(NumberFieldMapper.NumberType.values()))); } public void testDocValuesFieldExistsForKeyword() throws IOException { diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/range/DateRangeAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/range/DateRangeAggregatorTests.java index dff4f897cfad8..b890d25c8a83a 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/range/DateRangeAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/range/DateRangeAggregatorTests.java @@ -29,6 +29,7 @@ import org.elasticsearch.index.mapper.BooleanFieldMapper; import org.elasticsearch.index.mapper.DateFieldMapper; import org.elasticsearch.index.mapper.DateFieldMapper.Resolution; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.NumberFieldMapper; @@ -212,9 +213,8 @@ public void testUnboundedRanges() throws IOException { new RangeAggregationBuilder("name").field(DATE_FIELD_NAME).addUnboundedTo(5).addUnboundedFrom(5), new DateFieldMapper.DateFieldType( DATE_FIELD_NAME, - randomBoolean(), - randomBoolean(), - true, + IndexType.points(randomBoolean(), true), + false, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, Resolution.MILLISECONDS, null, @@ -492,7 +492,7 @@ private void testCase( ) throws IOException { DateFieldMapper.DateFieldType fieldType = new DateFieldMapper.DateFieldType( DATE_FIELD_NAME, - true, + IndexType.points(true, true), false, true, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/range/RangeAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/range/RangeAggregatorTests.java index aa7e312f601af..d58b72f788c03 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/range/RangeAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/range/RangeAggregatorTests.java @@ -22,6 +22,7 @@ import org.elasticsearch.core.CheckedConsumer; import org.elasticsearch.index.mapper.DateFieldMapper; import org.elasticsearch.index.mapper.DateFieldMapper.Resolution; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.LongScriptFieldType; import org.elasticsearch.index.mapper.LuceneDocument; @@ -302,9 +303,8 @@ public void testUnboundedRanges() throws IOException { new NumberFieldMapper.NumberFieldType( NUMBER_FIELD_NAME, NumberType.INTEGER, + IndexType.points(randomBoolean(), true), randomBoolean(), - randomBoolean(), - true, false, null, Collections.emptyMap(), @@ -321,9 +321,8 @@ public void testUnboundedRanges() throws IOException { public void testDateFieldMillisecondResolution() throws IOException { DateFieldMapper.DateFieldType fieldType = new DateFieldMapper.DateFieldType( DATE_FIELD_NAME, + IndexType.points(randomBoolean(), true), randomBoolean(), - randomBoolean(), - true, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, Resolution.MILLISECONDS, null, @@ -351,9 +350,8 @@ public void testDateFieldMillisecondResolution() throws IOException { public void testDateFieldNanosecondResolution() throws IOException { DateFieldMapper.DateFieldType fieldType = new DateFieldMapper.DateFieldType( DATE_FIELD_NAME, - true, + IndexType.points(true, true), false, - true, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, DateFieldMapper.Resolution.NANOSECONDS, null, @@ -382,9 +380,8 @@ public void testDateFieldNanosecondResolution() throws IOException { public void testMissingDateWithDateNanosField() throws IOException { DateFieldMapper.DateFieldType fieldType = new DateFieldMapper.DateFieldType( DATE_FIELD_NAME, - true, + IndexType.points(true, true), false, - true, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, DateFieldMapper.Resolution.NANOSECONDS, null, @@ -415,21 +412,7 @@ public void testMissingDateWithDateNanosField() throws IOException { } public void testNotFitIntoDouble() throws IOException { - MappedFieldType fieldType = new NumberFieldMapper.NumberFieldType( - NUMBER_FIELD_NAME, - NumberType.LONG, - true, - false, - true, - false, - null, - Collections.emptyMap(), - null, - false, - null, - null, - false - ); + MappedFieldType fieldType = new NumberFieldMapper.NumberFieldType(NUMBER_FIELD_NAME, NumberType.LONG); long start = 2L << 54; // Double stores 53 bits of mantissa, so we aggregate a bunch of bigger values @@ -701,9 +684,8 @@ private void testCase( MappedFieldType fieldType = new NumberFieldMapper.NumberFieldType( NUMBER_FIELD_NAME, NumberFieldMapper.NumberType.INTEGER, + IndexType.points(randomBoolean(), true), randomBoolean(), - randomBoolean(), - true, false, null, Collections.emptyMap(), diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/KeywordTermsAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/KeywordTermsAggregatorTests.java index c29f82e188739..45de5a3ced582 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/KeywordTermsAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/KeywordTermsAggregatorTests.java @@ -97,14 +97,10 @@ private void testSearchCase( Consumer> verify, ValueType valueType ) throws IOException { - MappedFieldType keywordFieldType = new KeywordFieldMapper.KeywordFieldType( - KEYWORD_FIELD, - randomBoolean(), - true, - Collections.emptyMap() - ); + boolean indexed = randomBoolean(); + MappedFieldType keywordFieldType = new KeywordFieldMapper.KeywordFieldType(KEYWORD_FIELD, indexed, true, Collections.emptyMap()); FieldType luceneFieldType = new FieldType(KeywordFieldMapper.Defaults.FIELD_TYPE); - if (keywordFieldType.isIndexed() == false) { + if (indexed == false) { luceneFieldType.setIndexOptions(IndexOptions.NONE); } luceneFieldType.freeze(); diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorTests.java index 2c94b814ebff0..c2d0a19675e7c 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorTests.java @@ -51,6 +51,7 @@ import org.elasticsearch.index.mapper.DocCountFieldMapper; import org.elasticsearch.index.mapper.GeoPointFieldMapper; import org.elasticsearch.index.mapper.IdFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.IpFieldMapper; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.KeywordFieldMapper.KeywordField; @@ -593,7 +594,7 @@ static List doc(MappedFieldType ft, String... values) { for (String v : values) { BytesRef bytes = new BytesRef(v); doc.add(new SortedSetDocValuesField(ft.name(), bytes)); - if (ft.isIndexed()) { + if (ft.indexType().hasTerms()) { doc.add(new KeywordField(ft.name(), bytes, KeywordFieldMapper.Defaults.FIELD_TYPE)); } } @@ -819,12 +820,12 @@ public void testStringIncludeExclude() throws Exception { private List doc(MappedFieldType ft1, MappedFieldType ft2, String f1v1, String f1v2, String f2v) { FieldType fieldType1 = new FieldType(KeywordFieldMapper.Defaults.FIELD_TYPE); - if (ft1.isIndexed() == false) { + if (ft1.indexType().hasTerms() == false) { fieldType1.setIndexOptions(IndexOptions.NONE); } fieldType1.freeze(); FieldType fieldType2 = new FieldType(KeywordFieldMapper.Defaults.FIELD_TYPE); - if (ft2.isIndexed() == false) { + if (ft2.indexType().hasTerms() == false) { fieldType2.setIndexOptions(IndexOptions.NONE); } fieldType2.freeze(); @@ -946,7 +947,7 @@ public void testStringTermsAggregator() throws Exception { } else { result.add(new SortedDocValuesField("field", new BytesRef(val))); } - if (fieldType.isIndexed()) { + if (fieldType.indexType().hasTerms()) { result.add(new StringField("field", new BytesRef(val), Field.Store.NO)); } return result; @@ -990,9 +991,7 @@ public void testIpTermsAggregator() throws Exception { } else { result.add(new SortedDocValuesField("field", new BytesRef(InetAddressPoint.encode(val)))); } - if (fieldType.isIndexed()) { - result.add(new InetAddressPoint("field", val)); - } + result.add(new InetAddressPoint("field", val)); return result; }; InetAddress[] base = new InetAddress[] { InetAddresses.forString("192.168.0.0") }; @@ -1327,11 +1326,11 @@ public void testGeoPointField() throws Exception { } public void testIpField() throws Exception { + boolean indexed = randomBoolean(); MappedFieldType fieldType = new IpFieldMapper.IpFieldType( "field", - randomBoolean(), + IndexType.points(indexed, true), false, - true, null, null, Collections.emptyMap(), @@ -1342,7 +1341,7 @@ public void testIpField() throws Exception { Document document = new Document(); InetAddress point = InetAddresses.forString("192.168.100.42"); document.add(new SortedSetDocValuesField("field", new BytesRef(InetAddressPoint.encode(point)))); - if (fieldType.isIndexed()) { + if (indexed) { document.add(new InetAddressPoint("field", point)); } iw.addDocument(document); diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsAggregatorTests.java index 4151beda6ba0c..321ddfc63242b 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/ExtendedStatsAggregatorTests.java @@ -17,6 +17,7 @@ import org.elasticsearch.common.time.DateFormatter; import org.elasticsearch.core.CheckedConsumer; import org.elasticsearch.index.mapper.DateFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.NumberFieldMapper; import org.elasticsearch.search.aggregations.AggregationBuilder; @@ -59,8 +60,7 @@ public void testEmptyDate() throws IOException { DateFormatter.forPattern("epoch_millis"); final MappedFieldType ft = new DateFieldMapper.DateFieldType( "field", - true, - true, + IndexType.points(true, true), false, true, DateFormatter.forPattern("epoch_millis"), diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorTests.java index b06d6e57b340a..b1c43e2e23252 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/StatsAggregatorTests.java @@ -22,6 +22,7 @@ import org.elasticsearch.common.time.DateFormatter; import org.elasticsearch.core.CheckedConsumer; import org.elasticsearch.index.mapper.DateFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.NumberFieldMapper; import org.elasticsearch.index.mapper.NumberFieldMapper.NumberType; @@ -80,10 +81,9 @@ public void testEmptyDate() throws IOException { DateFormatter.forPattern("epoch_millis"); final MappedFieldType ft = new DateFieldMapper.DateFieldType( "field", + IndexType.points(true, true), true, true, - false, - true, DateFormatter.forPattern("epoch_millis"), DateFieldMapper.Resolution.MILLISECONDS, null, diff --git a/server/src/test/java/org/elasticsearch/search/collapse/CollapseBuilderTests.java b/server/src/test/java/org/elasticsearch/search/collapse/CollapseBuilderTests.java index 78004a1186e34..790f8e2cd88ca 100644 --- a/server/src/test/java/org/elasticsearch/search/collapse/CollapseBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/collapse/CollapseBuilderTests.java @@ -18,6 +18,7 @@ import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.NumberFieldMapper; @@ -144,8 +145,7 @@ public void testBuild() throws IOException { numberFieldType = new NumberFieldMapper.NumberFieldType( "field", NumberFieldMapper.NumberType.LONG, - true, - false, + IndexType.points(true, false), false, false, null, @@ -163,10 +163,9 @@ public void testBuild() throws IOException { numberFieldType = new NumberFieldMapper.NumberFieldType( "field", NumberFieldMapper.NumberType.LONG, + IndexType.docValuesOnly(), false, false, - true, - false, null, Collections.emptyMap(), null, @@ -215,7 +214,7 @@ public void testBuildWithExceptions() { } { - MappedFieldType fieldType = new MappedFieldType("field", true, false, true, Collections.emptyMap()) { + MappedFieldType fieldType = new MappedFieldType("field", IndexType.points(true, true), false, Collections.emptyMap()) { @Override public String typeName() { return "some_type"; diff --git a/server/src/test/java/org/elasticsearch/search/slice/SliceBuilderTests.java b/server/src/test/java/org/elasticsearch/search/slice/SliceBuilderTests.java index 74eae0e633ea7..eb9ac353769fb 100644 --- a/server/src/test/java/org/elasticsearch/search/slice/SliceBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/slice/SliceBuilderTests.java @@ -30,6 +30,7 @@ import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.fielddata.IndexNumericFieldData; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.ValueFetcher; import org.elasticsearch.index.query.SearchExecutionContext; @@ -133,7 +134,8 @@ private SearchExecutionContext createShardContext( String fieldName, DocValuesType dvType ) { - MappedFieldType fieldType = new MappedFieldType(fieldName, true, false, dvType != null, Collections.emptyMap()) { + IndexType indexType = IndexType.terms(false, dvType != null); + MappedFieldType fieldType = new MappedFieldType(fieldName, indexType, false, Collections.emptyMap()) { @Override public ValueFetcher valueFetcher(SearchExecutionContext context, String format) { diff --git a/test/framework/src/main/java/org/elasticsearch/index/mapper/FieldTypeTestCase.java b/test/framework/src/main/java/org/elasticsearch/index/mapper/FieldTypeTestCase.java index adb45f6fef48e..fae33f51740f1 100644 --- a/test/framework/src/main/java/org/elasticsearch/index/mapper/FieldTypeTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/index/mapper/FieldTypeTestCase.java @@ -112,7 +112,7 @@ public void testFieldHasValueWithEmptyFieldInfos() { } public MappedFieldType getMappedFieldType() { - return new MappedFieldType("field", false, false, false, Collections.emptyMap()) { + return new MappedFieldType("field", IndexType.NONE, false, Collections.emptyMap()) { @Override public ValueFetcher valueFetcher(SearchExecutionContext context, String format) { diff --git a/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java b/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java index 2810783e8c7fb..98d6576f59a44 100644 --- a/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java @@ -169,7 +169,7 @@ protected void assertAggregatableConsistency(MappedFieldType ft) { try { ft.fielddataBuilder(FieldDataContext.noRuntimeFields("aggregation_test")); } catch (Exception e) { - fail("Unexpected exception when fetching field data from aggregatable field type"); + fail("Unexpected exception when fetching field data from aggregatable field type: " + e.getMessage()); } } else { expectThrows(IllegalArgumentException.class, () -> ft.fielddataBuilder(FieldDataContext.noRuntimeFields("aggregation_test"))); @@ -340,7 +340,8 @@ protected void assertExistsQuery(MappedFieldType fieldType, Query query, LuceneD // is not added to _field_names because it is not indexed nor stored assertEquals("field", termQuery.getTerm().text()); assertNoDocValuesField(fields, "field"); - if (fieldType.isIndexed() || fieldType.isStored()) { + IndexType indexType = fieldType.indexType(); + if (indexType.hasPoints() || indexType.hasTerms() || fieldType.isStored()) { assertNotNull(fields.getField(FieldNamesFieldMapper.NAME)); } else { assertNoFieldNamesField(fields); @@ -734,7 +735,7 @@ public final void testTextSearchInfoConsistency() throws IOException { } protected void assertSearchable(MappedFieldType fieldType) { - assertEquals(fieldType.isIndexed(), fieldType.getTextSearchInfo() != TextSearchInfo.NONE); + assertEquals(fieldType.isSearchable(), fieldType.getTextSearchInfo() != TextSearchInfo.NONE); } /** diff --git a/test/framework/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapperTests.java b/test/framework/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapperTests.java index 58234da1be393..18e60c008db96 100644 --- a/test/framework/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapperTests.java +++ b/test/framework/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapperTests.java @@ -298,7 +298,7 @@ public void testTimeSeriesIndexDefault() throws Exception { })); var ft = (NumberFieldMapper.NumberFieldType) mapperService.fieldType("field"); assertThat(ft.getMetricType(), equalTo(randomMetricType)); - assertThat(ft.isIndexed(), is(false)); + assertTrue(ft.indexType().hasOnlyDocValues()); } public void testMetricAndDocvalues() { diff --git a/test/framework/src/main/java/org/elasticsearch/search/aggregations/bucket/DateHistogramAggregatorTestCase.java b/test/framework/src/main/java/org/elasticsearch/search/aggregations/bucket/DateHistogramAggregatorTestCase.java index 9359e220bc28b..2e76df11cef86 100644 --- a/test/framework/src/main/java/org/elasticsearch/search/aggregations/bucket/DateHistogramAggregatorTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/search/aggregations/bucket/DateHistogramAggregatorTestCase.java @@ -16,6 +16,7 @@ import org.elasticsearch.common.CheckedBiConsumer; import org.elasticsearch.common.time.DateFormatter; import org.elasticsearch.index.mapper.DateFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.NumberFieldMapper; import org.elasticsearch.index.mapper.NumberFieldMapper.NumberType; @@ -107,7 +108,7 @@ protected final DateFieldMapper.DateFieldType aggregableDateFieldType( ) { return new DateFieldMapper.DateFieldType( AGGREGABLE_DATE, - isSearchable, + IndexType.points(isSearchable, true), randomBoolean(), true, formatter, diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapper.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapper.java index 7c3beaeb0bb78..8ae6901cd3407 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapper.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapper.java @@ -34,6 +34,7 @@ import org.elasticsearch.index.mapper.DocumentParsingException; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.IgnoreMalformedStoredValues; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.SourceLoader; @@ -140,7 +141,7 @@ protected void parseCreateField(DocumentParserContext context) { public static class HistogramFieldType extends MappedFieldType { public HistogramFieldType(String name, Map meta) { - super(name, false, false, true, meta); + super(name, IndexType.docValuesOnly(), false, meta); } @Override @@ -153,6 +154,11 @@ public ValueFetcher valueFetcher(SearchExecutionContext context, String format) return SourceValueFetcher.identity(name(), context, format); } + @Override + public boolean isSearchable() { + return false; + } + @Override public IndexFieldData.Builder fielddataBuilder(FieldDataContext fieldDataContext) { failIfNoDocValues(); diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregatorTests.java index e67b21ada67cf..52056db578590 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/multiterms/MultiTermsAggregatorTests.java @@ -27,6 +27,7 @@ import org.elasticsearch.core.CheckedConsumer; import org.elasticsearch.index.fielddata.ScriptDocValues; import org.elasticsearch.index.mapper.DateFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.NumberFieldMapper; @@ -688,7 +689,7 @@ protected List getSearchPlugins() { private DateFieldMapper.DateFieldType dateFieldType(String name) { return new DateFieldMapper.DateFieldType( name, - true, + IndexType.points(true, true), false, true, DateFormatter.forPattern("strict_date"), diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/rate/RateAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/rate/RateAggregatorTests.java index 1e47eb141e4cc..518d770e0e937 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/rate/RateAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/rate/RateAggregatorTests.java @@ -27,6 +27,7 @@ import org.elasticsearch.index.fielddata.ScriptDocValues; import org.elasticsearch.index.mapper.CustomTermFreqField; import org.elasticsearch.index.mapper.DateFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.NumberFieldMapper; @@ -929,7 +930,7 @@ protected List getSearchPlugins() { private DateFieldMapper.DateFieldType dateFieldType(String name) { return new DateFieldMapper.DateFieldType( name, - true, + IndexType.points(true, true), false, true, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/rate/TimeSeriesRateAggregatorTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/rate/TimeSeriesRateAggregatorTests.java index 563828527afb3..2d6f306ad67f9 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/rate/TimeSeriesRateAggregatorTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/rate/TimeSeriesRateAggregatorTests.java @@ -20,6 +20,7 @@ import org.elasticsearch.index.IndexMode; import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.mapper.DateFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; @@ -201,9 +202,8 @@ private MappedFieldType counterField(String name) { return new NumberFieldMapper.NumberFieldType( name, NumberFieldMapper.NumberType.LONG, - true, + IndexType.points(true, true), false, - true, false, null, Collections.emptyMap(), @@ -218,7 +218,7 @@ private MappedFieldType counterField(String name) { private DateFieldMapper.DateFieldType timeStampField() { return new DateFieldMapper.DateFieldType( "@timestamp", - true, + IndexType.points(true, true), false, true, DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER, diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/querydsl/query/SpatialRelatesQuery.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/querydsl/query/SpatialRelatesQuery.java index 98939b5a495f6..204dc56360a2c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/querydsl/query/SpatialRelatesQuery.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/querydsl/query/SpatialRelatesQuery.java @@ -231,7 +231,7 @@ private static org.apache.lucene.search.Query pointShapeQuery( ) { final MappedFieldType fieldType = context.getFieldType(fieldName); try { - return XYQueriesUtils.toXYPointQuery(geometry, fieldName, relation, fieldType.isIndexed(), fieldType.hasDocValues()); + return XYQueriesUtils.toXYPointQuery(geometry, fieldName, relation, fieldType.indexType()); } catch (IllegalArgumentException e) { throw new QueryShardException(context, "Exception creating query on Field [" + fieldName + "] " + e.getMessage(), e); } @@ -249,7 +249,7 @@ private static org.apache.lucene.search.Query shapeShapeQuery( } final MappedFieldType fieldType = context.getFieldType(fieldName); try { - return XYQueriesUtils.toXYShapeQuery(geometry, fieldName, relation, fieldType.isIndexed(), fieldType.hasDocValues()); + return XYQueriesUtils.toXYShapeQuery(geometry, fieldName, relation, fieldType.indexType()); } catch (IllegalArgumentException e) { throw new QueryShardException(context, "Exception creating query on Field [" + fieldName + "] " + e.getMessage(), e); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/stats/SearchContextStats.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/stats/SearchContextStats.java index 89aa2402248b8..31f90edd43b6a 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/stats/SearchContextStats.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/stats/SearchContextStats.java @@ -111,7 +111,7 @@ private FieldConfig makeFieldConfig(String field) { mixedFieldType = true; } exists |= true; - indexed &= type.isIndexed(); + indexed &= type.indexType().hasDenseIndex(); hasDocValues &= type.hasDocValues(); hasExactSubfield &= type instanceof TextFieldMapper.TextFieldType t && t.canUseSyntheticSourceDelegateForQuerying(); } else { diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/mapper/OffsetSourceFieldMapper.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/mapper/OffsetSourceFieldMapper.java index 41dfb842df3a8..9c4e153f27f08 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/mapper/OffsetSourceFieldMapper.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/mapper/OffsetSourceFieldMapper.java @@ -14,6 +14,7 @@ import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.ValueFetcher; @@ -132,7 +133,7 @@ public static final class OffsetSourceFieldType extends MappedFieldType { private final CharsetFormat charset; public OffsetSourceFieldType(String name, CharsetFormat charset, Map meta) { - super(name, true, false, false, meta); + super(name, IndexType.terms(true, false), false, meta); this.charset = charset; } diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapper.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapper.java index 1a6c455258f94..1a8b162eb1b46 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapper.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapper.java @@ -42,6 +42,7 @@ import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.DocumentParsingException; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.InferenceFieldMapper; import org.elasticsearch.index.mapper.InferenceMetadataFieldsMapper; import org.elasticsearch.index.mapper.KeywordFieldMapper; @@ -803,7 +804,7 @@ public SemanticTextFieldType( boolean useLegacyFormat, Map meta ) { - super(name, true, false, false, meta); + super(name, IndexType.terms(true, false), false, meta); this.inferenceId = inferenceId; this.searchInferenceId = searchInferenceId; this.modelSettings = modelSettings; diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapperTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapperTests.java index 98a5d93b1c85f..f47d7c4c37261 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapperTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapperTests.java @@ -41,6 +41,7 @@ import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.DocumentParsingException; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.InferenceMetadataFieldsMapper; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.LuceneDocument; @@ -276,7 +277,6 @@ public MappedFieldType getMappedFieldType() { @Override protected void assertSearchable(MappedFieldType fieldType) { assertThat(fieldType, instanceOf(SemanticTextFieldMapper.SemanticTextFieldType.class)); - assertTrue(fieldType.isIndexed()); assertTrue(fieldType.isSearchable()); } @@ -801,8 +801,7 @@ private static void assertSemanticTextField( assertNotNull(textMapper); assertThat(textMapper, instanceOf(KeywordFieldMapper.class)); KeywordFieldMapper textFieldMapper = (KeywordFieldMapper) textMapper; - assertFalse(textFieldMapper.fieldType().isIndexed()); - assertFalse(textFieldMapper.fieldType().hasDocValues()); + assertThat(textFieldMapper.fieldType().indexType(), equalTo(IndexType.NONE)); } else { assertNull(textMapper); var offsetMapper = semanticTextFieldType.getOffsetsField(); diff --git a/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleFieldMapper.java b/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleFieldMapper.java index 398ec2d4dc424..09f91209f922f 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleFieldMapper.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleFieldMapper.java @@ -34,6 +34,7 @@ import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.IgnoreMalformedStoredValues; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperBuilderContext; @@ -307,7 +308,7 @@ public AggregateMetricDoubleFieldType(String name) { } public AggregateMetricDoubleFieldType(String name, Map meta, MetricType metricType) { - super(name, true, false, true, meta); + super(name, IndexType.points(true, true), false, meta); this.metricType = metricType; } diff --git a/x-pack/plugin/mapper-counted-keyword/src/main/java/org/elasticsearch/xpack/countedkeyword/CountedKeywordFieldMapper.java b/x-pack/plugin/mapper-counted-keyword/src/main/java/org/elasticsearch/xpack/countedkeyword/CountedKeywordFieldMapper.java index f41dbff6dfc1c..b741849c69e23 100644 --- a/x-pack/plugin/mapper-counted-keyword/src/main/java/org/elasticsearch/xpack/countedkeyword/CountedKeywordFieldMapper.java +++ b/x-pack/plugin/mapper-counted-keyword/src/main/java/org/elasticsearch/xpack/countedkeyword/CountedKeywordFieldMapper.java @@ -120,6 +120,11 @@ private static class CountedKeywordFieldType extends StringFieldType { this.countFieldType = countFieldType; } + @Override + public boolean isSearchable() { + return indexType.hasTerms(); + } + @Override public ValueFetcher valueFetcher(SearchExecutionContext context, String format) { return SourceValueFetcher.identity(name(), context, format); @@ -272,7 +277,7 @@ private static CountedKeywordFieldMapper toType(FieldMapper in) { } public static class Builder extends FieldMapper.Builder { - private final Parameter indexed = Parameter.indexParam(m -> toType(m).mappedFieldType.isIndexed(), true); + private final Parameter indexed = Parameter.indexParam(m -> toType(m).fieldType == FIELD_TYPE_INDEXED, true); private final Parameter> meta = Parameter.metaParam(); private final SourceKeepMode indexSourceKeepMode; diff --git a/x-pack/plugin/mapper-exponential-histogram/src/main/java/org/elasticsearch/xpack/exponentialhistogram/ExponentialHistogramFieldMapper.java b/x-pack/plugin/mapper-exponential-histogram/src/main/java/org/elasticsearch/xpack/exponentialhistogram/ExponentialHistogramFieldMapper.java index 3ad9d0e2bde04..1f9078f979e72 100644 --- a/x-pack/plugin/mapper-exponential-histogram/src/main/java/org/elasticsearch/xpack/exponentialhistogram/ExponentialHistogramFieldMapper.java +++ b/x-pack/plugin/mapper-exponential-histogram/src/main/java/org/elasticsearch/xpack/exponentialhistogram/ExponentialHistogramFieldMapper.java @@ -35,6 +35,7 @@ import org.elasticsearch.index.mapper.DocumentParsingException; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.IgnoreMalformedStoredValues; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.SourceLoader; @@ -240,7 +241,7 @@ protected void parseCreateField(DocumentParserContext context) { static class ExponentialHistogramFieldType extends MappedFieldType { ExponentialHistogramFieldType(String name, Map meta) { - super(name, false, false, true, meta); + super(name, IndexType.docValuesOnly(), false, meta); } @Override @@ -253,6 +254,11 @@ public ValueFetcher valueFetcher(SearchExecutionContext context, String format) return SourceValueFetcher.identity(name(), context, format); } + @Override + public boolean isSearchable() { + return false; + } + @Override public boolean isAggregatable() { return true; diff --git a/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapper.java b/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapper.java index cd8c96a0a5e19..74459072b8979 100644 --- a/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapper.java +++ b/x-pack/plugin/mapper-unsigned-long/src/main/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapper.java @@ -35,6 +35,7 @@ import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.IgnoreMalformedStoredValues; import org.elasticsearch.index.mapper.IgnoredSourceFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.MapperParsingException; @@ -225,9 +226,8 @@ public UnsignedLongFieldMapper build(MapperBuilderContext context) { } UnsignedLongFieldType fieldType = new UnsignedLongFieldType( context.buildFullName(leafName()), - indexed.getValue(), + IndexType.points(indexed.get(), hasDocValues.get()), stored.getValue(), - hasDocValues.getValue(), parsedNullValue(), meta.getValue(), dimension.getValue(), @@ -275,9 +275,8 @@ public static final class UnsignedLongFieldType extends SimpleMappedFieldType { public UnsignedLongFieldType( String name, - boolean indexed, + IndexType indexType, boolean isStored, - boolean hasDocValues, Number nullValueFormatted, Map meta, boolean isDimension, @@ -285,7 +284,7 @@ public UnsignedLongFieldType( IndexMode indexMode, boolean isSyntheticSource ) { - super(name, indexed, isStored, hasDocValues, meta); + super(name, indexType, isStored, meta); this.nullValueFormatted = nullValueFormatted; this.isDimension = isDimension; this.metricType = metricType; @@ -294,7 +293,7 @@ public UnsignedLongFieldType( } public UnsignedLongFieldType(String name) { - this(name, true, false, true, null, Collections.emptyMap(), false, null, null, false); + this(name, IndexType.points(true, true), false, null, Collections.emptyMap(), false, null, null, false); } @Override @@ -412,8 +411,8 @@ protected Object parseSourceValue(Object value) { return unsignedToSortableSignedLong(parseUnsignedLong(value)); } }; - BlockSourceReader.LeafIteratorLookup lookup = hasDocValues() == false && (isStored() || isIndexed()) - // We only write the field names field if there aren't doc values or norms + BlockSourceReader.LeafIteratorLookup lookup = hasDocValues() == false && isStored() + // We only write the field names field if there aren't doc values ? BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name()) : BlockSourceReader.lookupMatchingAll(); return new BlockSourceReader.LongsBlockLoader(valueFetcher, lookup); @@ -490,6 +489,7 @@ public IndexFieldData.Builder fielddataBuilder(FieldDataContext fieldDataContext : IndexNumericFieldData.NumericType.LONG.getValuesSourceType(); if ((operation == FielddataOperation.SEARCH || operation == FielddataOperation.SCRIPT) && hasDocValues()) { + boolean indexed = indexType.hasPoints(); return (cache, breakerService) -> { final IndexNumericFieldData signedLongValues = new SortedNumericIndexFieldData.Builder( name(), @@ -498,9 +498,9 @@ public IndexFieldData.Builder fielddataBuilder(FieldDataContext fieldDataContext (dv, n) -> { throw new UnsupportedOperationException(); }, - isIndexed() + indexed ).build(cache, breakerService); - return new UnsignedLongIndexFieldData(signedLongValues, UnsignedLongDocValuesField::new, isIndexed()); + return new UnsignedLongIndexFieldData(signedLongValues, UnsignedLongDocValuesField::new, indexed); }; } @@ -561,7 +561,7 @@ public DocValueFormat docValueFormat(String format, ZoneId timeZone) { @Override public Function pointReaderIfPossible() { - if (isIndexed()) { + if (indexType.hasPoints()) { // convert from the shifted value back to the original value return (value) -> convertUnsignedLongToDouble(LongPoint.decodeDimension(value, 0)); } diff --git a/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java b/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java index d07e0ba3d0194..cb28a6168c561 100644 --- a/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java +++ b/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java @@ -43,7 +43,6 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; public class UnsignedLongFieldMapperTests extends WholeNumberFieldMapperTests { @@ -352,7 +351,7 @@ public void testTimeSeriesIndexDefault() throws Exception { })); var ft = (UnsignedLongFieldMapper.UnsignedLongFieldType) mapperService.fieldType("field"); assertThat(ft.getMetricType(), equalTo(randomMetricType)); - assertThat(ft.isIndexed(), is(false)); + assertTrue(ft.indexType().hasOnlyDocValues()); } @Override diff --git a/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldTypeTests.java b/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldTypeTests.java index ee8fce81a2082..8d867995f1b8c 100644 --- a/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldTypeTests.java +++ b/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldTypeTests.java @@ -10,6 +10,7 @@ import org.apache.lucene.document.LongPoint; import org.apache.lucene.search.MatchNoDocsQuery; import org.elasticsearch.index.mapper.FieldTypeTestCase; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.xpack.unsignedlong.UnsignedLongFieldMapper.UnsignedLongFieldType; @@ -56,8 +57,7 @@ public void testTermsQuery() { public void testRangeQuery() { UnsignedLongFieldType ft = new UnsignedLongFieldType( "my_unsigned_long", - true, - false, + IndexType.points(true, false), false, null, Collections.emptyMap(), diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/aggs/frequentitemsets/FrequentItemSetsAggregatorTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/aggs/frequentitemsets/FrequentItemSetsAggregatorTests.java index 93ef45285b60e..122cf3e54cf63 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/aggs/frequentitemsets/FrequentItemSetsAggregatorTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/aggs/frequentitemsets/FrequentItemSetsAggregatorTests.java @@ -21,6 +21,7 @@ import org.elasticsearch.common.time.DateFormatter; import org.elasticsearch.core.Tuple; import org.elasticsearch.index.mapper.DateFieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.IpFieldMapper; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; @@ -673,7 +674,7 @@ private static BytesRef encodeIp(String ip) { private DateFieldMapper.DateFieldType dateFieldType(String name) { return new DateFieldMapper.DateFieldType( name, - true, + IndexType.points(true, true), false, true, DateFormatter.forPattern("strict_date_optional_time"), diff --git a/x-pack/plugin/rank-vectors/src/main/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapper.java b/x-pack/plugin/rank-vectors/src/main/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapper.java index 5c9c1c7d79f41..adb925757b6ca 100644 --- a/x-pack/plugin/rank-vectors/src/main/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapper.java +++ b/x-pack/plugin/rank-vectors/src/main/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapper.java @@ -20,6 +20,7 @@ import org.elasticsearch.index.mapper.ArraySourceValueFetcher; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperBuilderContext; @@ -172,7 +173,7 @@ public RankVectorsFieldType( XPackLicenseState licenseState, Map meta ) { - super(name, false, false, true, meta); + super(name, IndexType.docValuesOnly(), false, meta); this.element = Element.getElement(elementType); this.dims = dims; this.licenseState = licenseState; @@ -183,6 +184,11 @@ public String typeName() { return CONTENT_TYPE; } + @Override + public boolean isSearchable() { + return false; + } + @Override public boolean isVectorEmbedding() { return true; diff --git a/x-pack/plugin/rank-vectors/src/test/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapperTests.java b/x-pack/plugin/rank-vectors/src/test/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapperTests.java index f53f9a1c92f0e..ad29a191aace3 100644 --- a/x-pack/plugin/rank-vectors/src/test/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapperTests.java +++ b/x-pack/plugin/rank-vectors/src/test/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapperTests.java @@ -136,7 +136,6 @@ protected boolean supportsIgnoreMalformed() { @Override protected void assertSearchable(MappedFieldType fieldType) { assertThat(fieldType, instanceOf(RankVectorsFieldMapper.RankVectorsFieldType.class)); - assertFalse(fieldType.isIndexed()); assertFalse(fieldType.isSearchable()); } diff --git a/x-pack/plugin/rank-vectors/src/test/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldTypeTests.java b/x-pack/plugin/rank-vectors/src/test/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldTypeTests.java index 205a67accb79d..f265c1310621b 100644 --- a/x-pack/plugin/rank-vectors/src/test/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldTypeTests.java +++ b/x-pack/plugin/rank-vectors/src/test/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldTypeTests.java @@ -51,9 +51,9 @@ public void testHasDocValues() { public void testIsIndexed() { RankVectorsFieldType fft = createFloatFieldType(); - assertFalse(fft.isIndexed()); + assertTrue(fft.indexType().hasOnlyDocValues()); RankVectorsFieldType bft = createByteFieldType(); - assertFalse(bft.isIndexed()); + assertTrue(bft.indexType().hasOnlyDocValues()); } public void testIsSearchable() { diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java index bde057e95ffc6..8e63a97678602 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java @@ -39,6 +39,7 @@ import org.elasticsearch.index.mapper.GeoShapeIndexer; import org.elasticsearch.index.mapper.GeoShapeParser; import org.elasticsearch.index.mapper.GeoShapeQueryable; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperBuilderContext; @@ -231,7 +232,7 @@ public GeoShapeWithDocValuesFieldType( boolean isSyntheticSource, Map meta ) { - super(name, indexed, isStored, hasDocValues, parser, orientation, meta); + super(name, IndexType.points(indexed, hasDocValues), isStored, parser, orientation, meta); this.scriptValues = scriptValues; this.geoFormatterFactory = geoFormatterFactory; this.isSyntheticSource = isSyntheticSource; @@ -263,7 +264,7 @@ public Query geoShapeQuery(SearchExecutionContext context, String fieldName, Sha ); } Query query; - if (isIndexed()) { + if (indexType.hasPoints()) { query = LatLonShape.newGeometryQuery(fieldName, relation.getLuceneRelation(), geometries); if (hasDocValues()) { final Query queryDocValues = new LatLonShapeDocValuesQuery(fieldName, relation.getLuceneRelation(), geometries); @@ -378,6 +379,7 @@ public Mapper.Builder parse(String name, Map node, MappingParser private final Builder builder; private final GeoShapeIndexer indexer; + private final boolean indexed; public GeoShapeWithDocValuesFieldMapper( String simpleName, @@ -399,6 +401,7 @@ public GeoShapeWithDocValuesFieldMapper( ); this.builder = builder; this.indexer = indexer; + this.indexed = mappedFieldType.indexType().hasPoints(); } @Override @@ -409,7 +412,7 @@ protected void index(DocumentParserContext context, Geometry geometry) { } final Geometry normalizedGeometry = indexer.normalize(geometry); final List fields = indexer.getIndexableFields(normalizedGeometry); - if (fieldType().isIndexed()) { + if (indexed) { context.doc().addAll(fields); } if (fieldType().hasDocValues()) { @@ -421,7 +424,7 @@ protected void index(DocumentParserContext context, Geometry geometry) { } // we need to pass the original geometry to compute more precisely the centroid, e.g if lon > 180 docValuesField.add(fields, geometry); - } else if (fieldType().isIndexed()) { + } else if (indexed) { context.addToFieldNames(fieldType().name()); } diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapper.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapper.java index a338432cf4953..021b89c2c2ab9 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapper.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapper.java @@ -30,6 +30,7 @@ import org.elasticsearch.index.mapper.BlockLoader; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.query.SearchExecutionContext; @@ -161,7 +162,7 @@ public PointFieldMapper( @Override protected void index(DocumentParserContext context, CartesianPoint point) { - final boolean indexed = fieldType().isIndexed(); + final boolean indexed = fieldType().indexType().hasPoints(); final boolean hasDocValues = fieldType().hasDocValues(); final boolean store = fieldType().isStored(); if (indexed && hasDocValues) { @@ -204,7 +205,7 @@ private PointFieldType( boolean isSyntheticSource, Map meta ) { - super(name, indexed, stored, hasDocValues, parser, nullValue, meta); + super(name, IndexType.points(indexed, hasDocValues), stored, parser, nullValue, meta); this.isSyntheticSource = isSyntheticSource; } @@ -231,7 +232,7 @@ public String typeName() { @Override public Query shapeQuery(Geometry shape, String fieldName, ShapeRelation relation, SearchExecutionContext context) { failIfNotIndexedNorDocValuesFallback(context); - return XYQueriesUtils.toXYPointQuery(shape, fieldName, relation, isIndexed(), hasDocValues()); + return XYQueriesUtils.toXYPointQuery(shape, fieldName, relation, indexType()); } @Override diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapper.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapper.java index e6c2c0c2687ac..99c1db4151642 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapper.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapper.java @@ -25,6 +25,7 @@ import org.elasticsearch.index.mapper.BlockLoader; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.query.QueryShardException; @@ -154,7 +155,7 @@ public ShapeFieldType( boolean isSyntheticSource, Map meta ) { - super(name, indexed, false, hasDocValues, parser, orientation, meta); + super(name, IndexType.points(indexed, hasDocValues), false, parser, orientation, meta); this.isSyntheticSource = isSyntheticSource; } @@ -179,7 +180,7 @@ public Query shapeQuery(Geometry shape, String fieldName, ShapeRelation relation ); } try { - return XYQueriesUtils.toXYShapeQuery(shape, fieldName, relation, isIndexed(), hasDocValues()); + return XYQueriesUtils.toXYShapeQuery(shape, fieldName, relation, indexType()); } catch (IllegalArgumentException e) { throw new QueryShardException(context, "Exception creating query on Field [" + fieldName + "] " + e.getMessage(), e); } @@ -256,8 +257,9 @@ protected void index(DocumentParserContext context, Geometry geometry) { if (geometry == null) { return; } + boolean indexed = fieldType().indexType().hasPoints(); List fields = indexer.indexShape(geometry); - if (fieldType().isIndexed()) { + if (indexed) { context.doc().addAll(fields); } if (fieldType().hasDocValues()) { @@ -268,7 +270,7 @@ protected void index(DocumentParserContext context, Geometry geometry) { context.doc().addWithKey(name, docValuesField); } docValuesField.add(fields, geometry); - } else if (fieldType().isIndexed()) { + } else if (indexed) { context.addToFieldNames(fieldType().name()); } } diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/ingest/CircleProcessorTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/ingest/CircleProcessorTests.java index 11a0f9ec6f11f..444764d4b8b1a 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/ingest/CircleProcessorTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/ingest/CircleProcessorTests.java @@ -27,6 +27,7 @@ import org.elasticsearch.geometry.utils.WellKnownText; import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.mapper.GeoShapeIndexer; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.query.SearchExecutionContext; import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.RandomDocumentPicks; @@ -243,13 +244,12 @@ public void testShapeQuery() throws IOException { int numSides = randomIntBetween(4, 1000); Geometry geometry = CircleUtils.createRegularShapePolygon(circle, numSides); - Query sameShapeQuery = XYQueriesUtils.toXYShapeQuery(geometry, fieldName, ShapeRelation.INTERSECTS, true, true); + Query sameShapeQuery = XYQueriesUtils.toXYShapeQuery(geometry, fieldName, ShapeRelation.INTERSECTS, IndexType.points(true, true)); Query centerPointQuery = XYQueriesUtils.toXYShapeQuery( new Point(circle.getLon(), circle.getLat()), fieldName, ShapeRelation.INTERSECTS, - true, - true + IndexType.points(true, true) ); try (Directory dir = newDirectory(); RandomIndexWriter w = new RandomIndexWriter(random(), dir)) { diff --git a/x-pack/plugin/wildcard/src/main/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapper.java b/x-pack/plugin/wildcard/src/main/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapper.java index 4a289a6d97bfb..a537e71d27d77 100644 --- a/x-pack/plugin/wildcard/src/main/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapper.java +++ b/x-pack/plugin/wildcard/src/main/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapper.java @@ -64,6 +64,7 @@ import org.elasticsearch.index.mapper.CompositeSyntheticFieldLoader; import org.elasticsearch.index.mapper.DocumentParserContext; import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.IndexType; import org.elasticsearch.index.mapper.KeywordFieldMapper; import org.elasticsearch.index.mapper.LuceneDocument; import org.elasticsearch.index.mapper.MappedFieldType; @@ -279,7 +280,7 @@ public static final class WildcardFieldType extends MappedFieldType { private final IgnoreAbove ignoreAbove; private WildcardFieldType(String name, IndexVersion version, Map meta, Builder builder) { - super(name, true, false, true, meta); + super(name, IndexType.terms(true, true), false, meta); if (version.onOrAfter(IndexVersions.V_7_10_0)) { this.analyzer = WILDCARD_ANALYZER_7_10; } else {