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 f1b4391546598..4b6b54979509c 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 @@ -23,6 +23,7 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.NumericUtils; +import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.common.breaker.NoopCircuitBreaker; import org.elasticsearch.common.logging.LogConfigurator; import org.elasticsearch.common.lucene.Lucene; @@ -111,6 +112,15 @@ public class ValuesSourceReaderBenchmark { BigArrays.NON_RECYCLING_INSTANCE ); + public static IndexSettings defaultIndexSettings() { + IndexMetadata INDEX_METADATA = IndexMetadata.builder("index") + .settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, IndexVersion.current())) + .numberOfShards(1) + .numberOfReplicas(0) + .build(); + return new IndexSettings(INDEX_METADATA, Settings.EMPTY); + } + static { // Smoke test all the expected values and force loading subclasses more like prod selfTest(); @@ -223,7 +233,7 @@ private static BlockLoader blockLoader(String name) { Lucene.KEYWORD_ANALYZER, Lucene.KEYWORD_ANALYZER, Lucene.KEYWORD_ANALYZER, - new KeywordFieldMapper.Builder(name, IndexVersion.current()).docValues(ft.docValuesType() != DocValuesType.NONE), + new KeywordFieldMapper.Builder(name, defaultIndexSettings()).docValues(ft.docValuesType() != DocValuesType.NONE), syntheticSource ).blockLoader(new MappedFieldType.BlockLoaderContext() { @Override diff --git a/modules/aggregations/src/test/java/org/elasticsearch/aggregations/bucket/timeseries/TimeSeriesAggregatorTests.java b/modules/aggregations/src/test/java/org/elasticsearch/aggregations/bucket/timeseries/TimeSeriesAggregatorTests.java index 493b4bdc81860..7c6c0203208e5 100644 --- a/modules/aggregations/src/test/java/org/elasticsearch/aggregations/bucket/timeseries/TimeSeriesAggregatorTests.java +++ b/modules/aggregations/src/test/java/org/elasticsearch/aggregations/bucket/timeseries/TimeSeriesAggregatorTests.java @@ -23,7 +23,6 @@ import org.apache.lucene.util.BytesRef; import org.elasticsearch.aggregations.bucket.AggregationTestCase; import org.elasticsearch.core.CheckedConsumer; -import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.mapper.DataStreamTimestampFieldMapper; import org.elasticsearch.index.mapper.DateFieldMapper; import org.elasticsearch.index.mapper.KeywordFieldMapper; @@ -79,10 +78,10 @@ public void testStandAloneTimeSeriesWithSum() throws IOException { assertThat(((Sum) ts.getBucketByKey("{dim1=bbb, dim2=zzz}").getAggregations().get("sum")).value(), equalTo(22.0)); }, - new KeywordFieldMapper.Builder("dim1", IndexVersion.current()).dimension(true) + new KeywordFieldMapper.Builder("dim1", defaultIndexSettings()).dimension(true) .build(MapperBuilderContext.root(true, true)) .fieldType(), - new KeywordFieldMapper.Builder("dim2", IndexVersion.current()).dimension(true) + new KeywordFieldMapper.Builder("dim2", defaultIndexSettings()).dimension(true) .build(MapperBuilderContext.root(true, true)) .fieldType(), new NumberFieldMapper.NumberFieldType("val1", NumberFieldMapper.NumberType.INTEGER) @@ -149,7 +148,7 @@ public void testWithDateHistogramExecutedAsFilterByFilterWithTimeSeriesIndexSear aggregationBuilder, TimeSeriesIdFieldMapper.FIELD_TYPE, new DateFieldMapper.DateFieldType("@timestamp"), - new KeywordFieldMapper.Builder("dim1", IndexVersion.current()).dimension(true) + new KeywordFieldMapper.Builder("dim1", defaultIndexSettings()).dimension(true) .build(MapperBuilderContext.root(true, true)) .fieldType(), new NumberFieldMapper.NumberFieldType("val1", NumberFieldMapper.NumberType.INTEGER) @@ -202,10 +201,10 @@ public void testMultiBucketAggregationAsSubAggregation() throws IOException { new MatchAllDocsQuery(), buildIndex, verifier, - new KeywordFieldMapper.Builder("dim1", IndexVersion.current()).dimension(true) + new KeywordFieldMapper.Builder("dim1", defaultIndexSettings()).dimension(true) .build(MapperBuilderContext.root(true, true)) .fieldType(), - new KeywordFieldMapper.Builder("dim2", IndexVersion.current()).dimension(true) + new KeywordFieldMapper.Builder("dim2", defaultIndexSettings()).dimension(true) .build(MapperBuilderContext.root(true, true)) .fieldType() ); @@ -237,10 +236,10 @@ public void testAggregationSize() throws IOException { new MatchAllDocsQuery(), buildIndex, limitedVerifier, - new KeywordFieldMapper.Builder("dim1", IndexVersion.current()).dimension(true) + new KeywordFieldMapper.Builder("dim1", defaultIndexSettings()).dimension(true) .build(MapperBuilderContext.root(true, true)) .fieldType(), - new KeywordFieldMapper.Builder("dim2", IndexVersion.current()).dimension(true) + new KeywordFieldMapper.Builder("dim2", defaultIndexSettings()).dimension(true) .build(MapperBuilderContext.root(true, true)) .fieldType() ); 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 22d0ddfb53a11..f9b500aa7e28f 100644 --- a/modules/percolator/src/main/java/org/elasticsearch/percolator/PercolatorFieldMapper.java +++ b/modules/percolator/src/main/java/org/elasticsearch/percolator/PercolatorFieldMapper.java @@ -39,6 +39,7 @@ import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.core.Tuple; +import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.IndexVersions; import org.elasticsearch.index.mapper.BinaryFieldMapper; @@ -101,9 +102,7 @@ public class PercolatorFieldMapper extends FieldMapper { @Override public FieldMapper.Builder getMergeBuilder() { - return new Builder(leafName(), searchExecutionContext, mapUnmappedFieldsAsText, indexCreatedVersion, clusterTransportVersion).init( - this - ); + return new Builder(leafName(), searchExecutionContext, mapUnmappedFieldsAsText, indexSettings, clusterTransportVersion).init(this); } static class Builder extends FieldMapper.Builder { @@ -113,20 +112,20 @@ static class Builder extends FieldMapper.Builder { private final Supplier searchExecutionContext; private final boolean mapUnmappedFieldsAsText; - private final IndexVersion indexCreatedVersion; + private final IndexSettings indexSettings; private final Supplier clusterTransportVersion; Builder( String fieldName, Supplier searchExecutionContext, boolean mapUnmappedFieldsAsText, - IndexVersion indexCreatedVersion, + IndexSettings indexSettings, Supplier clusterTransportVersion ) { super(fieldName); this.searchExecutionContext = searchExecutionContext; this.mapUnmappedFieldsAsText = mapUnmappedFieldsAsText; - this.indexCreatedVersion = Objects.requireNonNull(indexCreatedVersion); + this.indexSettings = Objects.requireNonNull(indexSettings); this.clusterTransportVersion = clusterTransportVersion; } @@ -139,17 +138,9 @@ protected Parameter[] getParameters() { public PercolatorFieldMapper build(MapperBuilderContext context) { PercolatorFieldType fieldType = new PercolatorFieldType(context.buildFullName(leafName()), meta.getValue()); context = context.createChildContext(leafName(), null); - KeywordFieldMapper extractedTermsField = createExtractQueryFieldBuilder( - EXTRACTED_TERMS_FIELD_NAME, - context, - indexCreatedVersion - ); + KeywordFieldMapper extractedTermsField = createExtractQueryFieldBuilder(EXTRACTED_TERMS_FIELD_NAME, context, indexSettings); fieldType.queryTermsField = extractedTermsField.fieldType(); - KeywordFieldMapper extractionResultField = createExtractQueryFieldBuilder( - EXTRACTION_RESULT_FIELD_NAME, - context, - indexCreatedVersion - ); + KeywordFieldMapper extractionResultField = createExtractQueryFieldBuilder(EXTRACTION_RESULT_FIELD_NAME, context, indexSettings); fieldType.extractionResultField = extractionResultField.fieldType(); BinaryFieldMapper queryBuilderField = createQueryBuilderFieldBuilder(context); fieldType.queryBuilderField = queryBuilderField.fieldType(); @@ -157,7 +148,7 @@ public PercolatorFieldMapper build(MapperBuilderContext context) { // have to introduce a new field type... RangeFieldMapper rangeFieldMapper = createExtractedRangeFieldBuilder(RANGE_FIELD_NAME, RangeType.IP, context); fieldType.rangeField = rangeFieldMapper.fieldType(); - NumberFieldMapper minimumShouldMatchFieldMapper = createMinimumShouldMatchField(context, indexCreatedVersion); + NumberFieldMapper minimumShouldMatchFieldMapper = createMinimumShouldMatchField(context, indexSettings); fieldType.minimumShouldMatchField = minimumShouldMatchFieldMapper.fieldType(); fieldType.mapUnmappedFieldsAsText = mapUnmappedFieldsAsText; @@ -172,17 +163,13 @@ public PercolatorFieldMapper build(MapperBuilderContext context) { rangeFieldMapper, minimumShouldMatchFieldMapper, mapUnmappedFieldsAsText, - indexCreatedVersion, + indexSettings, clusterTransportVersion ); } - static KeywordFieldMapper createExtractQueryFieldBuilder( - String name, - MapperBuilderContext context, - IndexVersion indexCreatedVersion - ) { - KeywordFieldMapper.Builder queryMetadataFieldBuilder = new KeywordFieldMapper.Builder(name, indexCreatedVersion); + static KeywordFieldMapper createExtractQueryFieldBuilder(String name, MapperBuilderContext context, IndexSettings indexSettings) { + KeywordFieldMapper.Builder queryMetadataFieldBuilder = new KeywordFieldMapper.Builder(name, indexSettings); queryMetadataFieldBuilder.docValues(false); return queryMetadataFieldBuilder.build(context); } @@ -200,11 +187,11 @@ static RangeFieldMapper createExtractedRangeFieldBuilder(String name, RangeType return builder.build(context); } - static NumberFieldMapper createMinimumShouldMatchField(MapperBuilderContext context, IndexVersion indexCreatedVersion) { + static NumberFieldMapper createMinimumShouldMatchField(MapperBuilderContext context, IndexSettings indexSettings) { NumberFieldMapper.Builder builder = NumberFieldMapper.Builder.docValuesOnly( MINIMUM_SHOULD_MATCH_FIELD_NAME, NumberFieldMapper.NumberType.INTEGER, - indexCreatedVersion + indexSettings.getIndexVersionCreated() ); return builder.build(context); } @@ -219,7 +206,7 @@ public Builder parse(String name, Map node, MappingParserContext name, parserContext.searchExecutionContext(), getMapUnmappedFieldAsText(parserContext.getSettings()), - parserContext.indexVersionCreated(), + parserContext.getIndexSettings(), parserContext.clusterTransportVersion() ); } @@ -367,7 +354,7 @@ static Tuple, Map>> extractTermsAndRanges(In private final NumberFieldMapper minimumShouldMatchFieldMapper; private final RangeFieldMapper rangeFieldMapper; private final boolean mapUnmappedFieldsAsText; - private final IndexVersion indexCreatedVersion; + private final IndexSettings indexSettings; private final Supplier clusterTransportVersion; PercolatorFieldMapper( @@ -381,7 +368,7 @@ static Tuple, Map>> extractTermsAndRanges(In RangeFieldMapper rangeFieldMapper, NumberFieldMapper minimumShouldMatchFieldMapper, boolean mapUnmappedFieldsAsText, - IndexVersion indexCreatedVersion, + IndexSettings indexSettings, Supplier clusterTransportVersion ) { super(simpleName, mappedFieldType, builderParams); @@ -392,7 +379,7 @@ static Tuple, Map>> extractTermsAndRanges(In this.minimumShouldMatchFieldMapper = minimumShouldMatchFieldMapper; this.rangeFieldMapper = rangeFieldMapper; this.mapUnmappedFieldsAsText = mapUnmappedFieldsAsText; - this.indexCreatedVersion = indexCreatedVersion; + this.indexSettings = indexSettings; this.clusterTransportVersion = clusterTransportVersion; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java b/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java index d8647de21523e..41c87d6df0702 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java @@ -327,11 +327,7 @@ boolean createDynamicField(Mapper.Builder builder, DocumentParserContext context public boolean newDynamicStringField(DocumentParserContext context, String name) throws IOException { MapperBuilderContext mapperBuilderContext = context.createDynamicMapperBuilderContext(); if (mapperBuilderContext.parentObjectContainsDimensions()) { - return createDynamicField( - new KeywordFieldMapper.Builder(name, context.indexSettings().getIndexVersionCreated()), - context, - mapperBuilderContext - ); + return createDynamicField(new KeywordFieldMapper.Builder(name, context.indexSettings()), context, mapperBuilderContext); } else { var indexSettings = context.indexSettings(); return createDynamicField( @@ -342,9 +338,7 @@ public boolean newDynamicStringField(DocumentParserContext context, String name) context.indexAnalyzers(), SourceFieldMapper.isSynthetic(indexSettings), false - ).addMultiField( - new KeywordFieldMapper.Builder("keyword", context.indexSettings().getIndexVersionCreated(), true).ignoreAbove(256) - ), + ).addMultiField(new KeywordFieldMapper.Builder("keyword", context.indexSettings(), true).ignoreAbove(256)), context ); } 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 56bb2e479124f..773c42d584d4f 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java @@ -95,9 +95,7 @@ import static org.apache.lucene.index.IndexWriter.MAX_TERM_LENGTH; import static org.elasticsearch.core.Strings.format; import static org.elasticsearch.index.IndexSettings.IGNORE_ABOVE_SETTING; -import static org.elasticsearch.index.IndexSettings.USE_DOC_VALUES_SKIPPER; import static org.elasticsearch.index.mapper.FieldArrayContext.getOffsetsFieldName; -import static org.elasticsearch.index.mapper.Mapper.IgnoreAbove.getIgnoreAboveDefaultValue; /** * A field mapper for keywords. This mapper accepts strings and indexes them as-is. @@ -185,9 +183,6 @@ public static final class Builder extends FieldMapper.DimensionBuilder { false ); private final Parameter ignoreAbove; - private final int ignoreAboveDefault; - private final IndexSortConfig indexSortConfig; - private final IndexMode indexMode; private final Parameter indexOptions = TextParams.keywordIndexOptions(m -> toType(m).indexOptions); private final Parameter hasNorms = Parameter.normsParam(m -> toType(m).fieldType.omitNorms() == false, false); private final Parameter similarity = TextParams.similarity( @@ -216,67 +211,33 @@ public static final class Builder extends FieldMapper.DimensionBuilder { private final IndexAnalyzers indexAnalyzers; private final ScriptCompiler scriptCompiler; private final IndexVersion indexCreatedVersion; - private final boolean enableDocValuesSkipper; private final boolean forceDocValuesSkipper; - private final SourceKeepMode indexSourceKeepMode; private final boolean isWithinMultiField; + private final IndexSettings indexSettings; public Builder(final String name, final MappingParserContext mappingParserContext) { this( name, mappingParserContext.getIndexAnalyzers(), mappingParserContext.scriptCompiler(), - IGNORE_ABOVE_SETTING.get(mappingParserContext.getSettings()), - mappingParserContext.getIndexSettings().getIndexVersionCreated(), - mappingParserContext.getIndexSettings().getMode(), - mappingParserContext.getIndexSettings().getIndexSortConfig(), - USE_DOC_VALUES_SKIPPER.get(mappingParserContext.getSettings()), + mappingParserContext.getIndexSettings(), false, - mappingParserContext.getIndexSettings().sourceKeepMode(), mappingParserContext.isWithinMultiField() ); } - Builder( + public Builder( String name, IndexAnalyzers indexAnalyzers, ScriptCompiler scriptCompiler, - IndexVersion indexCreatedVersion, - SourceKeepMode sourceKeepMode, - boolean isWithinMultiField - ) { - this( - name, - indexAnalyzers, - scriptCompiler, - getIgnoreAboveDefaultValue(IndexMode.STANDARD, indexCreatedVersion), - indexCreatedVersion, - IndexMode.STANDARD, - null, - false, - false, - sourceKeepMode, - isWithinMultiField - ); - } - - private Builder( - String name, - IndexAnalyzers indexAnalyzers, - ScriptCompiler scriptCompiler, - int ignoreAboveDefault, - IndexVersion indexCreatedVersion, - IndexMode indexMode, - IndexSortConfig indexSortConfig, - boolean enableDocValuesSkipper, + IndexSettings indexSettings, boolean forceDocValuesSkipper, - SourceKeepMode indexSourceKeepMode, boolean isWithinMultiField ) { super(name); this.indexAnalyzers = indexAnalyzers; this.scriptCompiler = Objects.requireNonNull(scriptCompiler); - this.indexCreatedVersion = Objects.requireNonNull(indexCreatedVersion); + this.indexCreatedVersion = indexSettings.getIndexVersionCreated(); this.normalizer = Parameter.stringParam( "normalizer", indexCreatedVersion.isLegacyIndexVersion(), @@ -307,45 +268,25 @@ private Builder( ); } }).precludesParameters(normalizer); - this.ignoreAboveDefault = ignoreAboveDefault; - this.ignoreAbove = Parameter.ignoreAboveParam(m -> toType(m).fieldType().ignoreAbove().get(), ignoreAboveDefault); - this.indexSortConfig = indexSortConfig; - this.indexMode = indexMode; - this.enableDocValuesSkipper = enableDocValuesSkipper; + this.ignoreAbove = Parameter.ignoreAboveParam( + m -> toType(m).fieldType().ignoreAbove().get(), + IGNORE_ABOVE_SETTING.get(indexSettings.getSettings()) + ); this.forceDocValuesSkipper = forceDocValuesSkipper; - this.indexSourceKeepMode = indexSourceKeepMode; this.isWithinMultiField = isWithinMultiField; + this.indexSettings = indexSettings; } - public Builder(String name, IndexVersion indexCreatedVersion) { - this(name, null, ScriptCompiler.NONE, indexCreatedVersion, SourceKeepMode.NONE, false); + public Builder(String name, IndexSettings indexSettings) { + this(name, null, ScriptCompiler.NONE, indexSettings, false, false); } - public Builder(String name, IndexVersion indexCreatedVersion, boolean isWithinMultiField) { - this(name, null, ScriptCompiler.NONE, indexCreatedVersion, SourceKeepMode.NONE, isWithinMultiField); + public Builder(String name, IndexSettings indexSettings, boolean isWithinMultiField) { + this(name, null, ScriptCompiler.NONE, indexSettings, false, isWithinMultiField); } - public static Builder buildWithDocValuesSkipper( - String name, - IndexMode indexMode, - IndexVersion indexCreatedVersion, - boolean enableDocValuesSkipper, - boolean isWithinMultiField - ) { - return new Builder( - name, - null, - ScriptCompiler.NONE, - getIgnoreAboveDefaultValue(indexMode, indexCreatedVersion), - indexCreatedVersion, - indexMode, - // Sort config is used to decide if DocValueSkippers can be used. Since skippers are forced, a sort config is not needed. - null, - enableDocValuesSkipper, - true, - SourceKeepMode.NONE, - isWithinMultiField - ); + public static Builder buildWithDocValuesSkipper(String name, IndexSettings indexSettings, boolean isWithinMultiField) { + return new Builder(name, null, ScriptCompiler.NONE, indexSettings, true, isWithinMultiField); } public Builder ignoreAbove(int ignoreAbove) { @@ -474,12 +415,9 @@ private KeywordFieldType buildFieldType(MapperBuilderContext context, FieldType @Override public KeywordFieldMapper build(MapperBuilderContext context) { FieldType fieldtype = resolveFieldType( - enableDocValuesSkipper, forceDocValuesSkipper, - hasDocValues, - indexCreatedVersion, - indexSortConfig, - indexMode, + hasDocValues.get(), + indexSettings, context.buildFullName(leafName()) ); fieldtype.setOmitNorms(this.hasNorms.getValue() == false); @@ -501,7 +439,7 @@ public KeywordFieldMapper build(MapperBuilderContext context) { String offsetsFieldName = getOffsetsFieldName( context, - indexSourceKeepMode, + indexSettings.sourceKeepMode(), hasDocValues.getValue(), stored.getValue(), this, @@ -514,43 +452,33 @@ public KeywordFieldMapper build(MapperBuilderContext context) { buildFieldType(context, fieldtype), builderParams(this, context), this, - offsetsFieldName, - indexSourceKeepMode + offsetsFieldName ); } private static FieldType resolveFieldType( - final boolean enableDocValuesSkipper, final boolean forceDocValuesSkipper, - final Parameter hasDocValues, - final IndexVersion indexCreatedVersion, - final IndexSortConfig indexSortConfig, - final IndexMode indexMode, + boolean hasDocValues, + final IndexSettings indexSettings, final String fullFieldName ) { - if (enableDocValuesSkipper) { - if (forceDocValuesSkipper) { - assert hasDocValues.getValue(); - return new FieldType(Defaults.FIELD_TYPE_WITH_SKIP_DOC_VALUES); - } - if (indexCreatedVersion.onOrAfter(IndexVersions.SKIPPERS_ENABLED_BY_DEFAULT) - && shouldUseDocValuesSkipper(hasDocValues.getValue(), indexSortConfig, indexMode, fullFieldName)) { - return new FieldType(Defaults.FIELD_TYPE_WITH_SKIP_DOC_VALUES); - } + if (forceDocValuesSkipper || shouldUseDocValuesSkipper(hasDocValues, indexSettings, fullFieldName)) { + return new FieldType(Defaults.FIELD_TYPE_WITH_SKIP_DOC_VALUES); } return new FieldType(Defaults.FIELD_TYPE); } private static boolean shouldUseDocValuesSkipper( final boolean hasDocValues, - final IndexSortConfig indexSortConfig, - final IndexMode indexMode, + final IndexSettings indexSettings, final String fullFieldName ) { return hasDocValues - && IndexMode.LOGSDB.equals(indexMode) + && indexSettings.useDocValuesSkipper() + && indexSettings.getIndexVersionCreated().onOrAfter(IndexVersions.SKIPPERS_ENABLED_BY_DEFAULT) + && IndexMode.LOGSDB.equals(indexSettings.getMode()) && HOST_NAME.equals(fullFieldName) - && indexSortConfigByHostName(indexSortConfig); + && indexSortConfigByHostName(indexSettings.getIndexSortConfig()); } private static boolean indexSortConfigByHostName(final IndexSortConfig indexSortConfig) { @@ -570,7 +498,6 @@ public static final class KeywordFieldType extends TextFamilyFieldType { private final boolean eagerGlobalOrdinals; private final FieldValues scriptValues; private final boolean isDimension; - private final IndexSortConfig indexSortConfig; private final boolean hasDocValuesSkipper; public KeywordFieldType( @@ -594,11 +521,14 @@ public KeywordFieldType( ); this.eagerGlobalOrdinals = builder.eagerGlobalOrdinals.getValue(); this.normalizer = normalizer; - this.ignoreAbove = new IgnoreAbove(builder.ignoreAbove.getValue(), builder.indexMode, builder.indexCreatedVersion); + this.ignoreAbove = new IgnoreAbove( + builder.ignoreAbove.getValue(), + builder.indexSettings.getMode(), + builder.indexSettings.getIndexVersionCreated() + ); this.nullValue = builder.nullValue.getValue(); this.scriptValues = builder.scriptValues(); this.isDimension = builder.dimension.getValue(); - this.indexSortConfig = builder.indexSortConfig; this.hasDocValuesSkipper = DocValuesSkipIndexType.NONE.equals(fieldType.docValuesSkipIndexType()) == false; } @@ -614,7 +544,6 @@ public KeywordFieldType(String name, boolean isIndexed, boolean hasDocValues, Ma this.eagerGlobalOrdinals = false; this.scriptValues = null; this.isDimension = false; - this.indexSortConfig = null; this.hasDocValuesSkipper = false; } @@ -635,7 +564,6 @@ public KeywordFieldType(String name, FieldType fieldType) { this.eagerGlobalOrdinals = false; this.scriptValues = null; this.isDimension = false; - this.indexSortConfig = null; this.hasDocValuesSkipper = DocValuesSkipIndexType.NONE.equals(fieldType.docValuesSkipIndexType()) == false; } @@ -656,7 +584,6 @@ public KeywordFieldType(String name, NamedAnalyzer analyzer) { this.eagerGlobalOrdinals = false; this.scriptValues = null; this.isDimension = false; - this.indexSortConfig = null; this.hasDocValuesSkipper = false; } @@ -1104,10 +1031,6 @@ public boolean hasNormalizer() { return normalizer != Lucene.KEYWORD_ANALYZER; } - public IndexSortConfig getIndexSortConfig() { - return indexSortConfig; - } - public boolean hasDocValuesSkipper() { return hasDocValuesSkipper; } @@ -1133,16 +1056,11 @@ public Query automatonQuery( private final boolean splitQueriesOnWhitespace; private final Script script; private final ScriptCompiler scriptCompiler; - private final IndexVersion indexCreatedVersion; private final IndexAnalyzers indexAnalyzers; - private final int ignoreAboveDefault; - private final IndexMode indexMode; - private final IndexSortConfig indexSortConfig; - private final boolean enableDocValuesSkipper; + private final IndexSettings indexSettings; private final boolean forceDocValuesSkipper; private final String offsetsFieldName; - private final SourceKeepMode indexSourceKeepMode; private KeywordFieldMapper( String simpleName, @@ -1150,8 +1068,7 @@ private KeywordFieldMapper( KeywordFieldType mappedFieldType, BuilderParams builderParams, Builder builder, - String offsetsFieldName, - SourceKeepMode indexSourceKeepMode + String offsetsFieldName ) { super(simpleName, mappedFieldType, builderParams); assert fieldType.indexOptions().compareTo(IndexOptions.DOCS_AND_FREQS) <= 0; @@ -1165,14 +1082,9 @@ private KeywordFieldMapper( this.script = builder.script.get(); this.indexAnalyzers = builder.indexAnalyzers; this.scriptCompiler = builder.scriptCompiler; - this.indexCreatedVersion = builder.indexCreatedVersion; - this.ignoreAboveDefault = builder.ignoreAboveDefault; - this.indexMode = builder.indexMode; - this.indexSortConfig = builder.indexSortConfig; - this.enableDocValuesSkipper = builder.enableDocValuesSkipper; + this.indexSettings = builder.indexSettings; this.forceDocValuesSkipper = builder.forceDocValuesSkipper; this.offsetsFieldName = offsetsFieldName; - this.indexSourceKeepMode = indexSourceKeepMode; } @Override @@ -1338,13 +1250,8 @@ public FieldMapper.Builder getMergeBuilder() { leafName(), indexAnalyzers, scriptCompiler, - ignoreAboveDefault, - indexCreatedVersion, - indexMode, - indexSortConfig, - enableDocValuesSkipper, + indexSettings, forceDocValuesSkipper, - indexSourceKeepMode, fieldType().isWithinMultiField() ).dimension(fieldType().isDimension()).init(this); } diff --git a/server/src/test/java/org/elasticsearch/index/fielddata/AbstractFieldDataTestCase.java b/server/src/test/java/org/elasticsearch/index/fielddata/AbstractFieldDataTestCase.java index 87d25272cb96f..edf9da001a785 100644 --- a/server/src/test/java/org/elasticsearch/index/fielddata/AbstractFieldDataTestCase.java +++ b/server/src/test/java/org/elasticsearch/index/fielddata/AbstractFieldDataTestCase.java @@ -90,7 +90,7 @@ public > IFD getForField(String type, String field final MapperBuilderContext context = MapperBuilderContext.root(false, false); if (type.equals("string")) { if (docValues) { - fieldType = new KeywordFieldMapper.Builder(fieldName, IndexVersion.current()).build(context).fieldType(); + fieldType = new KeywordFieldMapper.Builder(fieldName, defaultIndexSettings()).build(context).fieldType(); } else { fieldType = new TextFieldMapper.Builder(fieldName, createDefaultIndexAnalyzers()).fielddata(true) .build(context) 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 7e98b05c8b638..d94206df27c64 100644 --- a/server/src/test/java/org/elasticsearch/index/fielddata/IndexFieldDataServiceTests.java +++ b/server/src/test/java/org/elasticsearch/index/fielddata/IndexFieldDataServiceTests.java @@ -79,7 +79,7 @@ public void testGetForFieldDefaults() { indicesService.getCircuitBreakerService() ); MapperBuilderContext context = MapperBuilderContext.root(false, false); - final MappedFieldType stringMapper = new KeywordFieldMapper.Builder("string", IndexVersion.current()).build(context).fieldType(); + final MappedFieldType stringMapper = new KeywordFieldMapper.Builder("string", defaultIndexSettings()).build(context).fieldType(); ifdService.clear(); IndexFieldData fd = ifdService.getForField(stringMapper, FieldDataContext.noRuntimeFields("test")); assertTrue(fd instanceof SortedSetOrdinalsIndexFieldData); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DocumentParserContextTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DocumentParserContextTests.java index 36d1ef22425a2..8e01fe4e59c2a 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DocumentParserContextTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DocumentParserContextTests.java @@ -10,7 +10,6 @@ package org.elasticsearch.index.mapper; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.index.IndexVersion; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentParser; @@ -57,7 +56,7 @@ public void testAddRuntimeFieldWhenLimitIsReachedViaMapper() { .put("index.mapping.total_fields.ignore_dynamic_beyond_limit", true) .build() ); - assertTrue(context.addDynamicMapper(new KeywordFieldMapper.Builder("keyword_field", IndexVersion.current()).build(root))); + assertTrue(context.addDynamicMapper(new KeywordFieldMapper.Builder("keyword_field", defaultIndexSettings()).build(root))); assertFalse(context.addDynamicRuntimeField(new TestRuntimeField("runtime_field", "keyword"))); assertThat(context.getIgnoredFields(), contains("runtime_field")); } @@ -70,7 +69,7 @@ public void testAddFieldWhenLimitIsReachedViaRuntimeField() { .build() ); assertTrue(context.addDynamicRuntimeField(new TestRuntimeField("runtime_field", "keyword"))); - assertFalse(context.addDynamicMapper(new KeywordFieldMapper.Builder("keyword_field", IndexVersion.current()).build(root))); + assertFalse(context.addDynamicMapper(new KeywordFieldMapper.Builder("keyword_field", defaultIndexSettings()).build(root))); assertThat(context.getIgnoredFields(), contains("keyword_field")); } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldTypeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldTypeTests.java index 815f19ec2cfb6..8e2e29343a195 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldTypeTests.java @@ -231,7 +231,7 @@ public void testNormalizeQueries() { } public void testFetchSourceValue() throws IOException { - MappedFieldType mapper = new KeywordFieldMapper.Builder("field", IndexVersion.current()).build( + MappedFieldType mapper = new KeywordFieldMapper.Builder("field", defaultIndexSettings()).build( MapperBuilderContext.root(false, false) ).fieldType(); assertEquals(List.of("value"), fetchSourceValue(mapper, "value")); @@ -241,26 +241,36 @@ public void testFetchSourceValue() throws IOException { IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> fetchSourceValue(mapper, "value", "format")); assertEquals("Field [field] of type [keyword] doesn't support formats.", e.getMessage()); - MappedFieldType ignoreAboveMapper = new KeywordFieldMapper.Builder("field", IndexVersion.current()).ignoreAbove(4) + MappedFieldType ignoreAboveMapper = new KeywordFieldMapper.Builder("field", defaultIndexSettings()).ignoreAbove(4) .build(MapperBuilderContext.root(false, false)) .fieldType(); assertEquals(List.of(), fetchSourceValue(ignoreAboveMapper, "value")); assertEquals(List.of("42"), fetchSourceValue(ignoreAboveMapper, 42L)); assertEquals(List.of("true"), fetchSourceValue(ignoreAboveMapper, true)); + IndexMetadata indexMetadata = IndexMetadata.builder("index") + .settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, IndexVersion.current())) + .numberOfShards(1) + .numberOfReplicas(0) + .build(); + IndexSettings indexSettings = new IndexSettings( + indexMetadata, + Settings.builder().put(Mapper.SYNTHETIC_SOURCE_KEEP_INDEX_SETTING.getKey(), randomFrom("arrays", "none").toString()).build() + ); + MappedFieldType normalizerMapper = new KeywordFieldMapper.Builder( "field", createIndexAnalyzers(), ScriptCompiler.NONE, - IndexVersion.current(), - randomFrom(Mapper.SourceKeepMode.values()), + indexSettings, + false, false ).normalizer("lowercase").build(MapperBuilderContext.root(false, false)).fieldType(); assertEquals(List.of("value"), fetchSourceValue(normalizerMapper, "VALUE")); assertEquals(List.of("42"), fetchSourceValue(normalizerMapper, 42L)); assertEquals(List.of("value"), fetchSourceValue(normalizerMapper, "value")); - MappedFieldType nullValueMapper = new KeywordFieldMapper.Builder("field", IndexVersion.current()).nullValue("NULL") + MappedFieldType nullValueMapper = new KeywordFieldMapper.Builder("field", defaultIndexSettings()).nullValue("NULL") .build(MapperBuilderContext.root(false, false)) .fieldType(); assertEquals(List.of("NULL"), fetchSourceValue(nullValueMapper, null)); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldsTests.java b/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldsTests.java index 41077d7c4b92f..49aed9e892cc5 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldsTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldsTests.java @@ -10,7 +10,6 @@ package org.elasticsearch.index.mapper; import org.elasticsearch.common.lucene.Lucene; -import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.analysis.IndexAnalyzers; import org.elasticsearch.script.ScriptCompiler; import org.elasticsearch.test.ESTestCase; @@ -62,8 +61,8 @@ private KeywordFieldMapper.Builder getKeywordFieldMapperBuilder(boolean isStored "field", IndexAnalyzers.of(Map.of(), Map.of("normalizer", Lucene.STANDARD_ANALYZER), Map.of()), ScriptCompiler.NONE, - IndexVersion.current(), - Mapper.SourceKeepMode.NONE, + defaultIndexSettings(), + false, false ); if (isStored) { diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java index 5fd18180df25d..c93d634f4b16c 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java @@ -9,6 +9,7 @@ package org.elasticsearch.index.mapper; import org.elasticsearch.common.Explicit; +import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.IndexVersion; import org.elasticsearch.script.ScriptCompiler; import org.elasticsearch.test.ESTestCase; @@ -25,6 +26,8 @@ public final class ObjectMapperMergeTests extends ESTestCase { + private final IndexSettings INDEX_SETTINGS = defaultIndexSettings(); + private final RootObjectMapper rootObjectMapper = createMapping(false, true, true, false); private RootObjectMapper createMapping( @@ -214,8 +217,8 @@ public void testMergeWithLimitTruncatedObjectField() { RootObjectMapper root = new RootObjectMapper.Builder("_doc").build(MapperBuilderContext.root(false, false)); RootObjectMapper mergeWith = new RootObjectMapper.Builder("_doc").add( new ObjectMapper.Builder("parent", Explicit.of(ObjectMapper.Subobjects.DISABLED)).add( - new KeywordFieldMapper.Builder("child1", IndexVersion.current()) - ).add(new KeywordFieldMapper.Builder("child2", IndexVersion.current())) + new KeywordFieldMapper.Builder("child1", INDEX_SETTINGS) + ).add(new KeywordFieldMapper.Builder("child2", INDEX_SETTINGS)) ).build(MapperBuilderContext.root(false, false)); ObjectMapper mergedAdd0 = root.merge(mergeWith, MapperMergeContext.root(false, false, MAPPING_UPDATE, 0)); @@ -243,11 +246,11 @@ public void testMergeWithLimitTruncatedObjectField() { public void testMergeSameObjectDifferentFields() { RootObjectMapper root = new RootObjectMapper.Builder("_doc").add( - new ObjectMapper.Builder("parent").add(new KeywordFieldMapper.Builder("child1", IndexVersion.current())) + new ObjectMapper.Builder("parent").add(new KeywordFieldMapper.Builder("child1", INDEX_SETTINGS)) ).build(MapperBuilderContext.root(false, false)); RootObjectMapper mergeWith = new RootObjectMapper.Builder("_doc").add( - new ObjectMapper.Builder("parent").add(new KeywordFieldMapper.Builder("child1", IndexVersion.current()).ignoreAbove(42)) - .add(new KeywordFieldMapper.Builder("child2", IndexVersion.current())) + new ObjectMapper.Builder("parent").add(new KeywordFieldMapper.Builder("child1", INDEX_SETTINGS).ignoreAbove(42)) + .add(new KeywordFieldMapper.Builder("child2", INDEX_SETTINGS)) ).build(MapperBuilderContext.root(false, false)); ObjectMapper mergedAdd0 = root.merge(mergeWith, MapperMergeContext.root(false, false, MAPPING_UPDATE, 0)); @@ -305,7 +308,7 @@ public void testMergeSubobjectsFalseWithObject() { ).build(MapperBuilderContext.root(false, false)); RootObjectMapper mergeWith = new RootObjectMapper.Builder("_doc").add( new ObjectMapper.Builder("parent").add( - new ObjectMapper.Builder("child").add(new KeywordFieldMapper.Builder("grandchild", IndexVersion.current())) + new ObjectMapper.Builder("child").add(new KeywordFieldMapper.Builder("grandchild", INDEX_SETTINGS)) ) ).build(MapperBuilderContext.root(false, false)); @@ -317,7 +320,7 @@ public void testMergeSubobjectsFalseWithObject() { public void testConflictingDynamicUpdate() { RootObjectMapper mergeInto = new RootObjectMapper.Builder("_doc").add( - new KeywordFieldMapper.Builder("http.status_code", IndexVersion.current()) + new KeywordFieldMapper.Builder("http.status_code", INDEX_SETTINGS) ).build(MapperBuilderContext.root(false, false)); RootObjectMapper mergeWith = new RootObjectMapper.Builder("_doc").add( new NumberFieldMapper.Builder( @@ -347,11 +350,11 @@ public void testConflictingDynamicUpdate() { public void testMergingWithPassThrough() { boolean isSourceSynthetic = randomBoolean(); var objectMapper = new RootObjectMapper.Builder("_doc").add( - new ObjectMapper.Builder("metrics").add(new KeywordFieldMapper.Builder("cpu_usage", IndexVersion.current())) + new ObjectMapper.Builder("metrics").add(new KeywordFieldMapper.Builder("cpu_usage", INDEX_SETTINGS)) ).build(MapperBuilderContext.root(isSourceSynthetic, true)); var passThroughMapper = new RootObjectMapper.Builder("_doc").add( new PassThroughObjectMapper.Builder("metrics").setPriority(10) - .add(new KeywordFieldMapper.Builder("memory_usage", IndexVersion.current())) + .add(new KeywordFieldMapper.Builder("memory_usage", INDEX_SETTINGS)) ).build(MapperBuilderContext.root(isSourceSynthetic, true)); RootObjectMapper merged = objectMapper.merge( passThroughMapper, @@ -364,7 +367,7 @@ public void testMergingWithPassThrough() { var subobjectsTrueMapper = new RootObjectMapper.Builder("_doc").add( new ObjectMapper.Builder("metrics", Explicit.of(ObjectMapper.Subobjects.ENABLED)).add( - new KeywordFieldMapper.Builder("cpu_usage", IndexVersion.current()) + new KeywordFieldMapper.Builder("cpu_usage", INDEX_SETTINGS) ) ).build(MapperBuilderContext.root(isSourceSynthetic, true)); IllegalArgumentException e = expectThrows( @@ -377,8 +380,8 @@ public void testMergingWithPassThrough() { ); } - private static RootObjectMapper createRootSubobjectFalseLeafWithDots() { - FieldMapper.Builder fieldBuilder = new KeywordFieldMapper.Builder("host.name", IndexVersion.current()); + private RootObjectMapper createRootSubobjectFalseLeafWithDots() { + FieldMapper.Builder fieldBuilder = new KeywordFieldMapper.Builder("host.name", INDEX_SETTINGS); FieldMapper fieldMapper = fieldBuilder.build(MapperBuilderContext.root(false, false)); assertEquals("host.name", fieldMapper.leafName()); assertEquals("host.name", fieldMapper.fullPath()); @@ -386,8 +389,8 @@ private static RootObjectMapper createRootSubobjectFalseLeafWithDots() { .build(MapperBuilderContext.root(false, false)); } - private static ObjectMapper.Builder createObjectSubobjectsFalseLeafWithDots() { - KeywordFieldMapper.Builder fieldBuilder = new KeywordFieldMapper.Builder("host.name", IndexVersion.current()); + private ObjectMapper.Builder createObjectSubobjectsFalseLeafWithDots() { + KeywordFieldMapper.Builder fieldBuilder = new KeywordFieldMapper.Builder("host.name", INDEX_SETTINGS); KeywordFieldMapper fieldMapper = fieldBuilder.build( new MapperBuilderContext( "foo.metrics", @@ -435,7 +438,7 @@ private TextFieldMapper.Builder createTextKeywordMultiField(String name) { private TextFieldMapper.Builder createTextKeywordMultiField(String name, String multiFieldName) { TextFieldMapper.Builder builder = new TextFieldMapper.Builder(name, createDefaultIndexAnalyzers()); - builder.multiFieldsBuilder.add(new KeywordFieldMapper.Builder(multiFieldName, IndexVersion.current())); + builder.multiFieldsBuilder.add(new KeywordFieldMapper.Builder(multiFieldName, INDEX_SETTINGS)); return builder; } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperTests.java index 0eeb8670bc24c..c27308acdcefd 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperTests.java @@ -570,7 +570,7 @@ public void testNestedObjectWithMultiFieldsgetTotalFieldsCount() { ObjectMapper.Builder mapperBuilder = new ObjectMapper.Builder("parent_size_1").add( new ObjectMapper.Builder("child_size_2").add( new TextFieldMapper.Builder("grand_child_size_3", createDefaultIndexAnalyzers()).addMultiField( - new KeywordFieldMapper.Builder("multi_field_size_4", IndexVersion.current()) + new KeywordFieldMapper.Builder("multi_field_size_4", defaultIndexSettings()) ) .addMultiField( new TextFieldMapper.Builder( @@ -580,7 +580,7 @@ public void testNestedObjectWithMultiFieldsgetTotalFieldsCount() { createDefaultIndexAnalyzers(), false, true - ).addMultiField(new KeywordFieldMapper.Builder("multi_field_of_multi_field_size_6", IndexVersion.current(), true)) + ).addMultiField(new KeywordFieldMapper.Builder("multi_field_of_multi_field_size_6", defaultIndexSettings(), true)) ) ) ); @@ -621,8 +621,8 @@ private ObjectMapper createObjectMapperWithAllParametersSet(CheckedConsumer fields = objectMapper.asFlattenedFieldMappers(rootContext).stream().map(FieldMapper::fullPath).toList(); assertThat(fields, containsInAnyOrder("parent.keyword1", "parent.child.keyword2")); } @@ -630,8 +630,8 @@ public void testFlatten() { public void testFlattenSubobjectsFalse() { MapperBuilderContext rootContext = MapperBuilderContext.root(false, false); ObjectMapper objectMapper = new ObjectMapper.Builder("parent", Explicit.of(ObjectMapper.Subobjects.DISABLED)).add( - new ObjectMapper.Builder("child").add(new KeywordFieldMapper.Builder("keyword2", IndexVersion.current())) - ).add(new KeywordFieldMapper.Builder("keyword1", IndexVersion.current())).build(rootContext); + new ObjectMapper.Builder("child").add(new KeywordFieldMapper.Builder("keyword2", defaultIndexSettings())) + ).add(new KeywordFieldMapper.Builder("keyword1", defaultIndexSettings())).build(rootContext); List fields = objectMapper.asFlattenedFieldMappers(rootContext).stream().map(FieldMapper::fullPath).toList(); assertThat(fields, containsInAnyOrder("parent.keyword1", "parent.child.keyword2")); } @@ -687,19 +687,19 @@ public void testFindParentMapper() { MapperBuilderContext rootContext = MapperBuilderContext.root(false, false); var rootBuilder = new RootObjectMapper.Builder("_doc"); - rootBuilder.add(new KeywordFieldMapper.Builder("keyword", IndexVersion.current())); + rootBuilder.add(new KeywordFieldMapper.Builder("keyword", defaultIndexSettings())); var child = new ObjectMapper.Builder("child"); - child.add(new KeywordFieldMapper.Builder("keyword2", IndexVersion.current())); - child.add(new KeywordFieldMapper.Builder("keyword.with.dot", IndexVersion.current())); + child.add(new KeywordFieldMapper.Builder("keyword2", defaultIndexSettings())); + child.add(new KeywordFieldMapper.Builder("keyword.with.dot", defaultIndexSettings())); var secondLevelChild = new ObjectMapper.Builder("child2"); - secondLevelChild.add(new KeywordFieldMapper.Builder("keyword22", IndexVersion.current())); + secondLevelChild.add(new KeywordFieldMapper.Builder("keyword22", defaultIndexSettings())); child.add(secondLevelChild); rootBuilder.add(child); var childWithDot = new ObjectMapper.Builder("childwith.dot"); - childWithDot.add(new KeywordFieldMapper.Builder("keyword3", IndexVersion.current())); - childWithDot.add(new KeywordFieldMapper.Builder("keyword4.with.dot", IndexVersion.current())); + childWithDot.add(new KeywordFieldMapper.Builder("keyword3", defaultIndexSettings())); + childWithDot.add(new KeywordFieldMapper.Builder("keyword4.with.dot", defaultIndexSettings())); rootBuilder.add(childWithDot); RootObjectMapper root = rootBuilder.build(rootContext); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/PassThroughObjectMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/PassThroughObjectMapperTests.java index b2939e4c309c5..c6764c34a1abb 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/PassThroughObjectMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/PassThroughObjectMapperTests.java @@ -10,7 +10,6 @@ package org.elasticsearch.index.mapper; import org.elasticsearch.common.Explicit; -import org.elasticsearch.index.IndexVersion; import java.io.IOException; import java.util.List; @@ -190,7 +189,7 @@ public void testMergingWithPassThrough() { var passThroughMapper = new RootObjectMapper.Builder("_doc").add(new PassThroughObjectMapper.Builder("metrics").setPriority(10)) .build(MapperBuilderContext.root(isSourceSynthetic, true)); var objectMapper = new RootObjectMapper.Builder("_doc").add( - new ObjectMapper.Builder("metrics").add(new KeywordFieldMapper.Builder("cpu_usage", IndexVersion.current())) + new ObjectMapper.Builder("metrics").add(new KeywordFieldMapper.Builder("cpu_usage", defaultIndexSettings())) ).build(MapperBuilderContext.root(isSourceSynthetic, true)); RootObjectMapper merged = passThroughMapper.merge( @@ -201,7 +200,7 @@ public void testMergingWithPassThrough() { var objectMapperWithSubObjectTrue = new RootObjectMapper.Builder("_doc").add( new ObjectMapper.Builder("metrics", Explicit.of(ObjectMapper.Subobjects.ENABLED)).add( - new KeywordFieldMapper.Builder("cpu_usage", IndexVersion.current()) + new KeywordFieldMapper.Builder("cpu_usage", defaultIndexSettings()) ) ).build(MapperBuilderContext.root(isSourceSynthetic, true)); @@ -218,7 +217,7 @@ public void testMergingWithPassThrough() { ); var rootObjectMapper = new RootObjectMapper.Builder("metrics").add( - new KeywordFieldMapper.Builder("cpu_usage", IndexVersion.current()) + new KeywordFieldMapper.Builder("cpu_usage", defaultIndexSettings()) ).build(MapperBuilderContext.root(isSourceSynthetic, true)); error = expectThrows( diff --git a/server/src/test/java/org/elasticsearch/index/query/SearchExecutionContextTests.java b/server/src/test/java/org/elasticsearch/index/query/SearchExecutionContextTests.java index 5c027e8c9994f..443f6608790aa 100644 --- a/server/src/test/java/org/elasticsearch/index/query/SearchExecutionContextTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/SearchExecutionContextTests.java @@ -477,7 +477,7 @@ public void testSyntheticSourceSearchLookup() throws IOException { // Build a mapping using synthetic source SourceFieldMapper sourceMapper = new SourceFieldMapper.Builder(null, Settings.EMPTY, false, false, false).setSynthetic().build(); RootObjectMapper root = new RootObjectMapper.Builder("_doc").add( - new KeywordFieldMapper.Builder("cat", IndexVersion.current()).ignoreAbove(100) + new KeywordFieldMapper.Builder("cat", defaultIndexSettings()).ignoreAbove(100) ).build(MapperBuilderContext.root(true, false)); Mapping mapping = new Mapping(root, new MetadataFieldMapper[] { sourceMapper }, Map.of()); MappingLookup lookup = MappingLookup.fromMapping(mapping); diff --git a/server/src/test/java/org/elasticsearch/search/SearchServiceTests.java b/server/src/test/java/org/elasticsearch/search/SearchServiceTests.java index de8d5d92f1aa4..11dc7da8cfdcd 100644 --- a/server/src/test/java/org/elasticsearch/search/SearchServiceTests.java +++ b/server/src/test/java/org/elasticsearch/search/SearchServiceTests.java @@ -459,7 +459,7 @@ private SearchExecutionContext createSearchExecutionContext( new MetadataFieldMapper[0], Collections.emptyMap() ); - KeywordFieldMapper keywordFieldMapper = new KeywordFieldMapper.Builder("field", IndexVersion.current()).build(root); + KeywordFieldMapper keywordFieldMapper = new KeywordFieldMapper.Builder("field", indexSettings).build(root); DateFieldMapper dateFieldMapper = new DateFieldMapper.Builder( "@timestamp", DateFieldMapper.Resolution.MILLISECONDS, diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java index c41c16506b163..80f34942b2b14 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESTestCase.java @@ -1751,6 +1751,15 @@ public Environment newEnvironment(Settings settings) { return TestEnvironment.newEnvironment(build); } + public static IndexSettings defaultIndexSettings() { + IndexMetadata INDEX_METADATA = IndexMetadata.builder("index") + .settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, IndexVersion.current())) + .numberOfShards(1) + .numberOfReplicas(0) + .build(); + return new IndexSettings(INDEX_METADATA, Settings.EMPTY); + } + /** Return consistent index settings for the provided index version. */ public static Settings.Builder settings(IndexVersion version) { return Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, version); 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 2d6f306ad67f9..f84a31cd88cb2 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 @@ -18,7 +18,6 @@ import org.elasticsearch.aggregations.bucket.timeseries.TimeSeriesAggregationBuilder; import org.elasticsearch.common.bytes.BytesReference; 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; @@ -192,7 +191,7 @@ private Document doc(long timestamp, BytesReference tsid, long counterValue, Str } private MappedFieldType dimensionField(String name) { - return new KeywordFieldMapper.Builder(name, IndexVersion.current()).dimension(true) + return new KeywordFieldMapper.Builder(name, defaultIndexSettings()).dimension(true) .docValues(true) .build(MapperBuilderContext.root(true, true)) .fieldType(); diff --git a/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/lucene/read/ValueSourceReaderTypeConversionTests.java b/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/lucene/read/ValueSourceReaderTypeConversionTests.java index 7c96633a7a602..7a0e5c1c6cd83 100644 --- a/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/lucene/read/ValueSourceReaderTypeConversionTests.java +++ b/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/lucene/read/ValueSourceReaderTypeConversionTests.java @@ -1407,7 +1407,7 @@ private KeywordFieldMapper.KeywordFieldType storedKeywordField(String name) { Lucene.KEYWORD_ANALYZER, Lucene.KEYWORD_ANALYZER, Lucene.KEYWORD_ANALYZER, - new KeywordFieldMapper.Builder(name, IndexVersion.current()).docValues(false), + new KeywordFieldMapper.Builder(name, defaultIndexSettings()).docValues(false), true // TODO randomize - load from stored keyword fields if stored even in synthetic source ); } diff --git a/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorTests.java b/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorTests.java index fde3d0c1d4451..fe6f3c30c5278 100644 --- a/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorTests.java +++ b/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorTests.java @@ -1585,7 +1585,7 @@ private KeywordFieldMapper.KeywordFieldType storedKeywordField(String name) { Lucene.KEYWORD_ANALYZER, Lucene.KEYWORD_ANALYZER, Lucene.KEYWORD_ANALYZER, - new KeywordFieldMapper.Builder(name, IndexVersion.current()).docValues(false), + new KeywordFieldMapper.Builder(name, defaultIndexSettings()).docValues(false), true // TODO randomize - load from stored keyword fields if stored even in synthetic source ); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsPhysicalOperationProviders.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsPhysicalOperationProviders.java index 281788d29f759..0708f205752ea 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsPhysicalOperationProviders.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsPhysicalOperationProviders.java @@ -236,7 +236,7 @@ private static class DefaultShardContextForUnmappedField extends DefaultShardCon } static MappedFieldType createUnmappedFieldType(String name, DefaultShardContext context) { - var builder = new KeywordFieldMapper.Builder(name, context.ctx.indexVersionCreated()); + var builder = new KeywordFieldMapper.Builder(name, context.ctx.getIndexSettings()); builder.docValues(false); builder.indexed(false); return new KeywordFieldMapper.KeywordFieldType( 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 390c32bb773f8..5fd3283878c63 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 @@ -301,15 +301,7 @@ public Builder( this.inferenceFieldBuilder = c -> { // Resolve the model setting from the registry if it has not been set yet. var resolvedModelSettings = modelSettings.get() != null ? modelSettings.get() : getResolvedModelSettings(c, false); - return createInferenceField( - c, - indexSettings.getIndexVersionCreated(), - useLegacyFormat, - resolvedModelSettings, - indexOptions.get(), - bitSetProducer, - indexSettings - ); + return createInferenceField(c, useLegacyFormat, resolvedModelSettings, indexOptions.get(), bitSetProducer, indexSettings); }; } @@ -1289,7 +1281,6 @@ public StoredFieldsSpec storedFieldsSpec() { private static ObjectMapper createInferenceField( MapperBuilderContext context, - IndexVersion indexVersionCreated, boolean useLegacyFormat, @Nullable MinimalServiceSettings modelSettings, @Nullable SemanticTextIndexOptions indexOptions, @@ -1297,12 +1288,11 @@ private static ObjectMapper createInferenceField( IndexSettings indexSettings ) { return new ObjectMapper.Builder(INFERENCE_FIELD, Explicit.of(ObjectMapper.Subobjects.ENABLED)).dynamic(ObjectMapper.Dynamic.FALSE) - .add(createChunksField(indexVersionCreated, useLegacyFormat, modelSettings, indexOptions, bitSetProducer, indexSettings)) + .add(createChunksField(useLegacyFormat, modelSettings, indexOptions, bitSetProducer, indexSettings)) .build(context); } private static NestedObjectMapper.Builder createChunksField( - IndexVersion indexVersionCreated, boolean useLegacyFormat, @Nullable MinimalServiceSettings modelSettings, @Nullable SemanticTextIndexOptions indexOptions, @@ -1320,7 +1310,7 @@ private static NestedObjectMapper.Builder createChunksField( chunksField.add(createEmbeddingsField(indexSettings.getIndexVersionCreated(), modelSettings, indexOptions, useLegacyFormat)); } if (useLegacyFormat) { - var chunkTextField = new KeywordFieldMapper.Builder(TEXT_FIELD, indexVersionCreated).indexed(false).docValues(false); + var chunkTextField = new KeywordFieldMapper.Builder(TEXT_FIELD, indexSettings).indexed(false).docValues(false); chunksField.add(chunkTextField); } else { chunksField.add(new OffsetSourceFieldMapper.Builder(CHUNKED_OFFSET_FIELD)); diff --git a/x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapper.java b/x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapper.java index 32421ddba97f2..06e76751460f1 100644 --- a/x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapper.java +++ b/x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapper.java @@ -192,9 +192,7 @@ public PatternTextFieldMapper build(MapperBuilderContext context) { BuilderParams builderParams = builderParams(this, context); var templateIdMapper = KeywordFieldMapper.Builder.buildWithDocValuesSkipper( patternTextFieldType.templateIdFieldName(leafName()), - indexSettings.getMode(), - indexCreatedVersion(), - true, + indexSettings, isWithinMultiField() ).indexed(false).build(context); return new PatternTextFieldMapper(leafName(), fieldType, patternTextFieldType, builderParams, this, templateIdMapper); diff --git a/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/job/RollupIndexerIndexingTests.java b/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/job/RollupIndexerIndexingTests.java index 54a57e4d137ef..89f977361ef43 100644 --- a/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/job/RollupIndexerIndexingTests.java +++ b/x-pack/plugin/rollup/src/test/java/org/elasticsearch/xpack/rollup/job/RollupIndexerIndexingTests.java @@ -729,7 +729,7 @@ private Map createFieldTypes(RollupJobConfig job) { if (job.getGroupConfig().getTerms() != null) { for (String field : job.getGroupConfig().getTerms().getFields()) { - MappedFieldType ft = new KeywordFieldMapper.Builder(field, IndexVersion.current()).build( + MappedFieldType ft = new KeywordFieldMapper.Builder(field, defaultIndexSettings()).build( MapperBuilderContext.root(false, false) ).fieldType(); fieldTypes.put(ft.name(), ft); diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/GeoLineAggregatorTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/GeoLineAggregatorTests.java index 1a9eb1fde6c87..44d3699ac0aef 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/GeoLineAggregatorTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/search/aggregations/GeoLineAggregatorTests.java @@ -38,7 +38,6 @@ import org.elasticsearch.geometry.simplify.SimplificationErrorCalculator; import org.elasticsearch.geometry.simplify.StreamingGeometrySimplifier; import org.elasticsearch.geometry.utils.WellKnownText; -import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.mapper.DataStreamTimestampFieldMapper; import org.elasticsearch.index.mapper.DateFieldMapper; import org.elasticsearch.index.mapper.GeoPointFieldMapper; @@ -951,7 +950,7 @@ private void testCase( } fieldTypes.add(new DateFieldMapper.DateFieldType("time_field")); fieldTypes.add( - new KeywordFieldMapper.Builder("group_id", IndexVersion.current()).dimension(true) + new KeywordFieldMapper.Builder("group_id", defaultIndexSettings()).dimension(true) .docValues(true) .indexed(false) .build(MapperBuilderContext.root(true, true)) diff --git a/x-pack/plugin/wildcard/src/test/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapperTests.java b/x-pack/plugin/wildcard/src/test/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapperTests.java index ed1b240ed53e5..a82bb21bb3707 100644 --- a/x-pack/plugin/wildcard/src/test/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapperTests.java +++ b/x-pack/plugin/wildcard/src/test/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapperTests.java @@ -132,7 +132,7 @@ public void setUp() throws Exception { org.elasticsearch.index.mapper.KeywordFieldMapper.Builder kwBuilder = new KeywordFieldMapper.Builder( KEYWORD_FIELD_NAME, - IndexVersion.current() + defaultIndexSettings() ); keywordFieldType = kwBuilder.build(MapperBuilderContext.root(false, false));