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..555a0b9375466 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 @@ -119,24 +119,25 @@ public void testValidateInvalidFieldType() { ); } - public void testValidateNotIndexed() { + public void testValidateNotSearchable() { Exception e = expectThrows(IllegalArgumentException.class, () -> createMapperService(timestampMapping(true, b -> { b.startObject("@timestamp"); b.field("type", "date"); b.field("index", false); + b.field("doc_values", false); b.endObject(); }))); - assertThat(e.getMessage(), equalTo("data stream timestamp field [@timestamp] is not indexed")); + assertThat(e.getMessage(), equalTo("data stream timestamp field [@timestamp] is not searchable")); } - public void testValidateNotDocValues() { + public void testValidateNotAggregatable() { Exception e = expectThrows(IllegalArgumentException.class, () -> createMapperService(timestampMapping(true, b -> { b.startObject("@timestamp"); b.field("type", "date"); b.field("doc_values", false); b.endObject(); }))); - assertThat(e.getMessage(), equalTo("data stream timestamp field [@timestamp] doesn't have doc values")); + assertThat(e.getMessage(), equalTo("data stream timestamp field [@timestamp] is not aggregatable")); } public void testValidateNullValue() { @@ -436,7 +437,7 @@ public void testFieldTypeWithDocValuesSkipper_DocValuesFalseEnabledDocValuesSkip ); assertEquals( ex.getMessage(), - "data stream timestamp field [" + DataStreamTimestampFieldMapper.DEFAULT_PATH + "] doesn't have doc values" + "data stream timestamp field [" + DataStreamTimestampFieldMapper.DEFAULT_PATH + "] is not aggregatable" ); } @@ -460,7 +461,7 @@ public void testFieldTypeWithDocValuesSkipper_DocValuesFalseDisabledDocValuesSki ); assertEquals( ex.getMessage(), - "data stream timestamp field [" + DataStreamTimestampFieldMapper.DEFAULT_PATH + "] doesn't have doc values" + "data stream timestamp field [" + DataStreamTimestampFieldMapper.DEFAULT_PATH + "] is not aggregatable" ); } 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 5bf5295e7adde..00d32bf32d5eb 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 @@ -134,13 +134,15 @@ public static class Builder extends FieldMapper.Builder { private final IndexMode indexMode; private final IndexVersion indexCreatedVersion; private final SourceKeepMode indexSourceKeepMode; + private final boolean indexDisabledByDefault; public Builder( String name, Settings settings, IndexMode indexMode, IndexVersion indexCreatedVersion, - SourceKeepMode indexSourceKeepMode + SourceKeepMode indexSourceKeepMode, + boolean indexDisabledByDefault ) { this( name, @@ -148,7 +150,8 @@ public Builder( COERCE_SETTING.get(settings), indexMode, indexCreatedVersion, - indexSourceKeepMode + indexSourceKeepMode, + indexDisabledByDefault ); } @@ -158,7 +161,8 @@ public Builder( boolean coerceByDefault, IndexMode indexMode, IndexVersion indexCreatedVersion, - SourceKeepMode indexSourceKeepMode + SourceKeepMode indexSourceKeepMode, + boolean indexDisabledByDefault ) { super(name); this.ignoreMalformed = Parameter.explicitBoolParam( @@ -170,6 +174,10 @@ public Builder( this.coerce = Parameter.explicitBoolParam("coerce", true, m -> toType(m).coerce, coerceByDefault); this.indexMode = indexMode; this.indexed = Parameter.indexParam(m -> toType(m).indexed, () -> { + if (indexDisabledByDefault) { + return false; + } + if (indexMode == IndexMode.TIME_SERIES) { var metricType = getMetric().getValue(); return metricType != TimeSeriesParams.MetricType.COUNTER && metricType != TimeSeriesParams.MetricType.GAUGE; @@ -190,6 +198,7 @@ public Builder( }); this.indexCreatedVersion = indexCreatedVersion; this.indexSourceKeepMode = indexSourceKeepMode; + this.indexDisabledByDefault = indexDisabledByDefault; } Builder scalingFactor(double scalingFactor) { @@ -257,7 +266,8 @@ public ScaledFloatFieldMapper build(MapperBuilderContext context) { c.getSettings(), c.getIndexSettings().getMode(), c.indexVersionCreated(), - c.getIndexSettings().sourceKeepMode() + c.getIndexSettings().sourceKeepMode(), + c.getIndexSettings().isIndexDisabledByDefault() ) ); @@ -592,6 +602,7 @@ public String toString() { private final IndexVersion indexCreatedVersion; private final String offsetsFieldName; private final SourceKeepMode indexSourceKeepMode; + private final boolean indexDisabledByDefault; private ScaledFloatFieldMapper( String simpleName, @@ -617,6 +628,7 @@ private ScaledFloatFieldMapper( this.indexCreatedVersion = builder.indexCreatedVersion; this.offsetsFieldName = offsetsFieldName; this.indexSourceKeepMode = builder.indexSourceKeepMode; + this.indexDisabledByDefault = builder.indexDisabledByDefault; } boolean coerce() { @@ -645,9 +657,15 @@ protected String contentType() { @Override public FieldMapper.Builder getMergeBuilder() { - return new Builder(leafName(), ignoreMalformedByDefault, coerceByDefault, indexMode, indexCreatedVersion, indexSourceKeepMode) - .metric(metricType) - .init(this); + return new Builder( + leafName(), + ignoreMalformedByDefault, + coerceByDefault, + indexMode, + indexCreatedVersion, + indexSourceKeepMode, + indexDisabledByDefault + ).metric(metricType).init(this); } @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..d8ab00292538a 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 @@ -222,17 +222,16 @@ public void testFieldData() throws IOException { } public void testFetchSourceValue() throws IOException { - MappedFieldType mapper = new ScaledFloatFieldMapper.Builder("field", false, false, null, null, null).scalingFactor(100) + MappedFieldType mapper = new ScaledFloatFieldMapper.Builder("field", false, false, null, null, null, false).scalingFactor(100) .build(MapperBuilderContext.root(false, false)) .fieldType(); assertEquals(List.of(3.14), fetchSourceValue(mapper, 3.1415926)); assertEquals(List.of(3.14), fetchSourceValue(mapper, "3.1415")); assertEquals(List.of(), fetchSourceValue(mapper, "")); - MappedFieldType nullValueMapper = new ScaledFloatFieldMapper.Builder("field", false, false, null, null, null).scalingFactor(100) - .nullValue(2.71) - .build(MapperBuilderContext.root(false, false)) - .fieldType(); + MappedFieldType nullValueMapper = new ScaledFloatFieldMapper.Builder("field", false, false, null, null, null, false).scalingFactor( + 100 + ).nullValue(2.71).build(MapperBuilderContext.root(false, false)).fieldType(); assertEquals(List.of(2.71), fetchSourceValue(nullValueMapper, "")); } } diff --git a/server/src/main/java/org/elasticsearch/common/settings/IndexScopedSettings.java b/server/src/main/java/org/elasticsearch/common/settings/IndexScopedSettings.java index 9f4c5b80ccf23..b2d49d2c22218 100644 --- a/server/src/main/java/org/elasticsearch/common/settings/IndexScopedSettings.java +++ b/server/src/main/java/org/elasticsearch/common/settings/IndexScopedSettings.java @@ -243,6 +243,9 @@ public final class IndexScopedSettings extends AbstractScopedSettings { if (IndexSettings.DOC_VALUES_SKIPPER) { settings.add(IndexSettings.USE_DOC_VALUES_SKIPPER); } + if (IndexSettings.INDEX_DISABLED_BY_DEFAULT_FEATURE_FLAG.isEnabled()) { + settings.add(IndexSettings.INDEX_DISABLED_BY_DEFAULT); + } if (SYNTHETIC_VECTORS) { settings.add(IndexSettings.INDEX_MAPPING_SOURCE_SYNTHETIC_VECTORS_SETTING); } diff --git a/server/src/main/java/org/elasticsearch/index/IndexSettings.java b/server/src/main/java/org/elasticsearch/index/IndexSettings.java index cd78d4323f44b..9c8ee199c6a40 100644 --- a/server/src/main/java/org/elasticsearch/index/IndexSettings.java +++ b/server/src/main/java/org/elasticsearch/index/IndexSettings.java @@ -685,6 +685,14 @@ public boolean isES87TSDBCodecEnabled() { Property.Final ); + public static final FeatureFlag INDEX_DISABLED_BY_DEFAULT_FEATURE_FLAG = new FeatureFlag("index_disabled_by_default"); + public static final Setting INDEX_DISABLED_BY_DEFAULT = Setting.boolSetting( + "index.mapping.index_disabled_by_default", + false, + Property.IndexScope, + Property.Final + ); + /** * The {@link IndexMode "mode"} of the index. */ @@ -944,6 +952,7 @@ private void setRetentionLeaseMillis(final TimeValue retentionLease) { private final boolean recoverySourceEnabled; private final boolean recoverySourceSyntheticEnabled; private final boolean useDocValuesSkipper; + private final boolean indexDisabledByDefault; /** * The maximum number of refresh listeners allows on this shard. @@ -1128,6 +1137,7 @@ public IndexSettings(final IndexMetadata indexMetadata, final Settings nodeSetti recoverySourceSyntheticEnabled = DiscoveryNode.isStateless(nodeSettings) == false && scopedSettings.get(RECOVERY_USE_SYNTHETIC_SOURCE_SETTING); useDocValuesSkipper = DOC_VALUES_SKIPPER && scopedSettings.get(USE_DOC_VALUES_SKIPPER); + indexDisabledByDefault = INDEX_DISABLED_BY_DEFAULT_FEATURE_FLAG.isEnabled() && scopedSettings.get(INDEX_DISABLED_BY_DEFAULT); seqNoIndexOptions = scopedSettings.get(SEQ_NO_INDEX_OPTIONS_SETTING); if (recoverySourceSyntheticEnabled) { if (DiscoveryNode.isStateless(settings)) { @@ -1841,6 +1851,10 @@ public boolean useDocValuesSkipper() { return useDocValuesSkipper; } + public boolean isIndexDisabledByDefault() { + return indexDisabledByDefault; + } + /** * The bounds for {@code @timestamp} on this index or * {@code null} if there are no bounds. 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 2843900c564c7..ea303ce6f3aea 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java @@ -78,7 +78,7 @@ private static BooleanFieldMapper toType(FieldMapper in) { public static final class Builder extends FieldMapper.DimensionBuilder { private final Parameter docValues = Parameter.docValuesParam(m -> toType(m).hasDocValues, true); - private final Parameter indexed = Parameter.indexParam(m -> toType(m).indexed, true); + private final Parameter indexed; private final Parameter stored = Parameter.storeParam(m -> toType(m).stored, false); private final Parameter> ignoreMalformed; private final Parameter nullValue = new Parameter<>( @@ -106,15 +106,18 @@ public static final class Builder extends FieldMapper.DimensionBuilder { private final SourceKeepMode indexSourceKeepMode; private final Parameter dimension; + private final boolean indexDisabledByDefault; public Builder( String name, ScriptCompiler scriptCompiler, boolean ignoreMalformedByDefault, IndexVersion indexCreatedVersion, - SourceKeepMode indexSourceKeepMode + SourceKeepMode indexSourceKeepMode, + boolean indexDisabledByDefault ) { super(name); + indexed = Parameter.indexParam(m -> toType(m).indexed, indexDisabledByDefault == false); this.scriptCompiler = Objects.requireNonNull(scriptCompiler); this.indexCreatedVersion = Objects.requireNonNull(indexCreatedVersion); this.ignoreMalformed = Parameter.explicitBoolParam( @@ -140,6 +143,7 @@ public Builder( }); this.indexSourceKeepMode = indexSourceKeepMode; + this.indexDisabledByDefault = indexDisabledByDefault; } public Builder dimension(boolean dimension) { @@ -217,7 +221,8 @@ private FieldValues scriptValues() { c.scriptCompiler(), IGNORE_MALFORMED_SETTING.get(c.getSettings()), c.indexVersionCreated(), - c.getIndexSettings().sourceKeepMode() + c.getIndexSettings().sourceKeepMode(), + c.getIndexSettings().isIndexDisabledByDefault() ) ); @@ -523,6 +528,7 @@ public Query rangeQuery( private final String offsetsFieldName; private final SourceKeepMode indexSourceKeepMode; + private final boolean indexDisabledByDefault; protected BooleanFieldMapper( String simpleName, @@ -546,6 +552,7 @@ protected BooleanFieldMapper( this.storeMalformedFields = storeMalformedFields; this.offsetsFieldName = offsetsFieldName; this.indexSourceKeepMode = builder.indexSourceKeepMode; + this.indexDisabledByDefault = builder.indexDisabledByDefault; } @Override @@ -634,9 +641,14 @@ protected void indexScriptValues( @Override public FieldMapper.Builder getMergeBuilder() { - return new Builder(leafName(), scriptCompiler, ignoreMalformedByDefault, indexCreatedVersion, indexSourceKeepMode).dimension( - fieldType().isDimension() - ).init(this); + return new Builder( + leafName(), + scriptCompiler, + ignoreMalformedByDefault, + indexCreatedVersion, + indexSourceKeepMode, + indexDisabledByDefault + ).dimension(fieldType().isDimension()).init(this); } @Override 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 b85e1bc4dc5d0..8d7abe9150723 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DataStreamTimestampFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DataStreamTimestampFieldMapper.java @@ -139,11 +139,11 @@ public void doValidate(MappingLookup lookup) { } DateFieldMapper dateFieldMapper = (DateFieldMapper) mapper; - if (dateFieldMapper.fieldType().isIndexed() == false && dateFieldMapper.fieldType().hasDocValuesSkipper() == false) { - throw new IllegalArgumentException("data stream timestamp field [" + DEFAULT_PATH + "] is not indexed"); + if (dateFieldMapper.fieldType().isSearchable() == false) { + throw new IllegalArgumentException("data stream timestamp field [" + DEFAULT_PATH + "] is not searchable"); } - if (dateFieldMapper.fieldType().hasDocValues() == false) { - throw new IllegalArgumentException("data stream timestamp field [" + DEFAULT_PATH + "] doesn't have doc values"); + if (dateFieldMapper.fieldType().isAggregatable() == false) { + throw new IllegalArgumentException("data stream timestamp field [" + DEFAULT_PATH + "] is not aggregatable"); } if (dateFieldMapper.getNullValue() != null) { throw new IllegalArgumentException( 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 76d6dbb941409..44d599a9bcc4c 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java @@ -257,7 +257,7 @@ private static DateFieldMapper toType(FieldMapper in) { public static final class Builder extends FieldMapper.Builder { - private final Parameter index = Parameter.indexParam(m -> toType(m).indexed, true); + private final Parameter index; private final Parameter docValues = Parameter.docValuesParam(m -> toType(m).hasDocValues, true); private final Parameter store = Parameter.storeParam(m -> toType(m).store, false); @@ -290,6 +290,7 @@ public static final class Builder extends FieldMapper.Builder { private final IndexMode indexMode; private final IndexSortConfig indexSortConfig; private final boolean useDocValuesSkipper; + private final boolean indexDisabledByDefault; public Builder( String name, @@ -308,6 +309,7 @@ public Builder( IndexMode.STANDARD, null, indexCreatedVersion, + false, false ); } @@ -321,9 +323,11 @@ public Builder( IndexMode indexMode, IndexSortConfig indexSortConfig, IndexVersion indexCreatedVersion, - boolean useDocValuesSkipper + boolean useDocValuesSkipper, + boolean indexDisabledByDefault ) { super(name); + this.index = Parameter.indexParam(m -> toType(m).indexed, indexDisabledByDefault == false); this.resolution = resolution; this.indexCreatedVersion = indexCreatedVersion; this.scriptCompiler = Objects.requireNonNull(scriptCompiler); @@ -348,6 +352,7 @@ public Builder( this.indexMode = indexMode; this.indexSortConfig = indexSortConfig; this.useDocValuesSkipper = useDocValuesSkipper; + this.indexDisabledByDefault = indexDisabledByDefault; } DateFormatter buildFormatter() { @@ -479,7 +484,8 @@ public DateFieldMapper build(MapperBuilderContext context) { c.getIndexSettings().getMode(), c.getIndexSettings().getIndexSortConfig(), c.indexVersionCreated(), - IndexSettings.USE_DOC_VALUES_SKIPPER.get(c.getSettings()) + IndexSettings.USE_DOC_VALUES_SKIPPER.get(c.getSettings()), + c.getIndexSettings().isIndexDisabledByDefault() ); }); @@ -494,7 +500,8 @@ public DateFieldMapper build(MapperBuilderContext context) { c.getIndexSettings().getMode(), c.getIndexSettings().getIndexSortConfig(), c.indexVersionCreated(), - IndexSettings.USE_DOC_VALUES_SKIPPER.get(c.getSettings()) + IndexSettings.USE_DOC_VALUES_SKIPPER.get(c.getSettings()), + c.getIndexSettings().isIndexDisabledByDefault() ); }); @@ -1153,6 +1160,7 @@ public DocValueFormat docValueFormat(@Nullable String format, ZoneId timeZone) { private final IndexMode indexMode; private final IndexSortConfig indexSortConfig; private final boolean hasDocValuesSkipper; + private final boolean indexDisabledByDefault; private DateFieldMapper( String leafName, @@ -1186,6 +1194,7 @@ private DateFieldMapper( this.indexMode = indexMode; this.indexSortConfig = indexSortConfig; this.hasDocValuesSkipper = hasDocValuesSkipper; + this.indexDisabledByDefault = builder.indexDisabledByDefault; } /** @@ -1234,7 +1243,8 @@ public FieldMapper.Builder getMergeBuilder() { indexMode, indexSortConfig, indexCreatedVersion, - hasDocValuesSkipper + hasDocValuesSkipper, + indexDisabledByDefault ).init(this); } 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 fc0b0d864547b..10db920ea242e 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java @@ -327,18 +327,18 @@ boolean createDynamicField(Mapper.Builder builder, DocumentParserContext context @Override public boolean newDynamicStringField(DocumentParserContext context, String name) throws IOException { MapperBuilderContext mapperBuilderContext = context.createDynamicMapperBuilderContext(); + var indexSettings = context.indexSettings(); if (mapperBuilderContext.parentObjectContainsDimensions()) { return createDynamicField( - new KeywordFieldMapper.Builder(name, context.indexSettings().getIndexVersionCreated()), + new KeywordFieldMapper.Builder(name, indexSettings.isIndexDisabledByDefault(), indexSettings.getIndexVersionCreated()), context, mapperBuilderContext ); } else { return createDynamicField( - new TextFieldMapper.Builder(name, context.indexAnalyzers(), SourceFieldMapper.isSynthetic(context.indexSettings())) - .addMultiField( - new KeywordFieldMapper.Builder("keyword", context.indexSettings().getIndexVersionCreated()).ignoreAbove(256) - ), + new TextFieldMapper.Builder(name, context.indexAnalyzers(), SourceFieldMapper.isSynthetic(indexSettings)).addMultiField( + new KeywordFieldMapper.Builder("keyword", indexSettings.getIndexVersionCreated()).ignoreAbove(256) + ), context ); } @@ -354,7 +354,8 @@ public boolean newDynamicLongField(DocumentParserContext context, String name) t context.indexSettings().getSettings(), context.indexSettings().getIndexVersionCreated(), context.indexSettings().getMode(), - context.indexSettings().sourceKeepMode() + context.indexSettings().sourceKeepMode(), + context.indexSettings().isIndexDisabledByDefault() ), context ); @@ -373,7 +374,8 @@ public boolean newDynamicDoubleField(DocumentParserContext context, String name) context.indexSettings().getSettings(), context.indexSettings().getIndexVersionCreated(), context.indexSettings().getMode(), - context.indexSettings().sourceKeepMode() + context.indexSettings().sourceKeepMode(), + context.indexSettings().isIndexDisabledByDefault() ), context ); @@ -389,7 +391,8 @@ public boolean newDynamicBooleanField(DocumentParserContext context, String name ScriptCompiler.NONE, ignoreMalformed, context.indexSettings().getIndexVersionCreated(), - context.indexSettings().sourceKeepMode() + context.indexSettings().sourceKeepMode(), + context.indexSettings().isIndexDisabledByDefault() ), context ); @@ -409,7 +412,8 @@ public boolean newDynamicDateField(DocumentParserContext context, String name, D context.indexSettings().getMode(), context.indexSettings().getIndexSortConfig(), context.indexSettings().getIndexVersionCreated(), - IndexSettings.USE_DOC_VALUES_SKIPPER.get(context.indexSettings().getSettings()) + IndexSettings.USE_DOC_VALUES_SKIPPER.get(context.indexSettings().getSettings()), + context.indexSettings().isIndexDisabledByDefault() ), context ); 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..bd2362e9f494b 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java @@ -108,13 +108,15 @@ public static final class Builder extends FieldMapper.Builder { private final Parameter metric; // either null, or POSITION if this is a time series metric private final Parameter dimension; // can only support time_series_dimension: false private final IndexMode indexMode; // either STANDARD or TIME_SERIES + private final boolean indexDisabledByDefault; public Builder( String name, ScriptCompiler scriptCompiler, boolean ignoreMalformedByDefault, IndexVersion indexCreatedVersion, - IndexMode mode + IndexMode mode, + boolean indexDisabledByDefault ) { super(name); this.ignoreMalformed = ignoreMalformedParam(m -> builder(m).ignoreMalformed.get(), ignoreMalformedByDefault); @@ -128,10 +130,13 @@ public Builder( this.indexCreatedVersion = Objects.requireNonNull(indexCreatedVersion); this.script.precludesParameters(nullValue, ignoreMalformed, ignoreZValue); this.indexMode = mode; - this.indexed = Parameter.indexParam( - m -> toType(m).indexed, - () -> indexMode != IndexMode.TIME_SERIES || getMetric().getValue() != TimeSeriesParams.MetricType.POSITION - ); + this.indexed = Parameter.indexParam(m -> toType(m).indexed, () -> { + if (indexDisabledByDefault) { + return false; + } + + return indexMode != IndexMode.TIME_SERIES || getMetric().getValue() != TimeSeriesParams.MetricType.POSITION; + }); addScriptValidation(script, indexed, hasDocValues); this.metric = TimeSeriesParams.metricParam(m -> toType(m).metricType, TimeSeriesParams.MetricType.POSITION).addValidator(v -> { @@ -149,6 +154,7 @@ public Builder( ); } }); + this.indexDisabledByDefault = indexDisabledByDefault; } private Parameter getMetric() { @@ -244,7 +250,8 @@ public FieldMapper build(MapperBuilderContext context) { c.scriptCompiler(), IGNORE_MALFORMED_SETTING.get(c.getSettings()), c.indexVersionCreated(), - c.getIndexSettings().getMode() + c.getIndexSettings().getMode(), + c.getIndexSettings().isIndexDisabledByDefault() ) ); @@ -254,6 +261,7 @@ public FieldMapper build(MapperBuilderContext context) { private final TimeSeriesParams.MetricType metricType; private final IndexMode indexMode; private final boolean indexed; + private final boolean indexDisabledByDefault; public GeoPointFieldMapper( String simpleName, @@ -277,6 +285,7 @@ public GeoPointFieldMapper( this.metricType = builder.metric.get(); this.indexMode = builder.indexMode; this.indexed = builder.indexed.get(); + this.indexDisabledByDefault = builder.indexDisabledByDefault; } @Override @@ -286,7 +295,8 @@ public FieldMapper.Builder getMergeBuilder() { builder.scriptCompiler, builder.ignoreMalformed.getDefaultValue().value(), indexCreatedVersion, - indexMode + indexMode, + indexDisabledByDefault ).init(this); } 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 8e7cf41ca21b7..253a334544352 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/IpFieldMapper.java @@ -76,7 +76,7 @@ private static IpFieldMapper toType(FieldMapper in) { public static final class Builder extends FieldMapper.DimensionBuilder { - private final Parameter indexed = Parameter.indexParam(m -> toType(m).indexed, true); + private final Parameter indexed; private final Parameter hasDocValues = Parameter.docValuesParam(m -> toType(m).hasDocValues, true); private final Parameter stored = Parameter.storeParam(m -> toType(m).stored, false); @@ -97,15 +97,18 @@ public static final class Builder extends FieldMapper.DimensionBuilder { private final IndexVersion indexCreatedVersion; private final ScriptCompiler scriptCompiler; private final SourceKeepMode indexSourceKeepMode; + private final boolean indexDisabledByDefault; public Builder( String name, ScriptCompiler scriptCompiler, boolean ignoreMalformedByDefault, IndexVersion indexCreatedVersion, - SourceKeepMode indexSourceKeepMode + SourceKeepMode indexSourceKeepMode, + boolean indexDisabledByDefault ) { super(name); + indexed = Parameter.indexParam(m -> toType(m).indexed, indexDisabledByDefault == false); this.scriptCompiler = Objects.requireNonNull(scriptCompiler); this.ignoreMalformedByDefault = ignoreMalformedByDefault; this.indexCreatedVersion = indexCreatedVersion; @@ -126,6 +129,7 @@ public Builder( } }); this.indexSourceKeepMode = indexSourceKeepMode; + this.indexDisabledByDefault = indexDisabledByDefault; } Builder nullValue(String nullValue) { @@ -230,7 +234,14 @@ public IpFieldMapper build(MapperBuilderContext context) { public static final TypeParser PARSER = createTypeParserWithLegacySupport((n, c) -> { boolean ignoreMalformedByDefault = IGNORE_MALFORMED_SETTING.get(c.getSettings()); - return new Builder(n, c.scriptCompiler(), ignoreMalformedByDefault, c.indexVersionCreated(), c.getIndexSettings().sourceKeepMode()); + return new Builder( + n, + c.scriptCompiler(), + ignoreMalformedByDefault, + c.indexVersionCreated(), + c.getIndexSettings().sourceKeepMode(), + c.getIndexSettings().isIndexDisabledByDefault() + ); }); public static final class IpFieldType extends SimpleMappedFieldType { @@ -600,6 +611,7 @@ public TermsEnum getTerms(IndexReader reader, String prefix, boolean caseInsensi private final ScriptCompiler scriptCompiler; private final SourceKeepMode indexSourceKeepMode; private final String offsetsFieldName; + private final boolean indexDisabledByDefault; private IpFieldMapper( String simpleName, @@ -625,6 +637,7 @@ private IpFieldMapper( this.storeIgnored = storeIgnored; this.indexSourceKeepMode = builder.indexSourceKeepMode; this.offsetsFieldName = offsetsFieldName; + this.indexDisabledByDefault = builder.indexDisabledByDefault; } @Override @@ -703,9 +716,14 @@ protected void indexScriptValues( @Override public FieldMapper.Builder getMergeBuilder() { - return new Builder(leafName(), scriptCompiler, ignoreMalformedByDefault, indexCreatedVersion, indexSourceKeepMode).dimension( - dimension - ).init(this); + return new Builder( + leafName(), + scriptCompiler, + ignoreMalformedByDefault, + indexCreatedVersion, + indexSourceKeepMode, + indexDisabledByDefault + ).dimension(dimension).init(this); } @Override 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 e26c969f7d495..df5635c1a483e 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java @@ -165,7 +165,7 @@ private static KeywordFieldMapper toType(FieldMapper in) { public static final class Builder extends FieldMapper.DimensionBuilder { - private final Parameter indexed = Parameter.indexParam(m -> toType(m).indexed, true); + private final Parameter indexed; private final Parameter hasDocValues = Parameter.docValuesParam(m -> toType(m).hasDocValues, true); private final Parameter stored = Parameter.storeParam(m -> toType(m).fieldType.stored(), false); @@ -211,6 +211,7 @@ public static final class Builder extends FieldMapper.DimensionBuilder { private final IndexVersion indexCreatedVersion; private final boolean enableDocValuesSkipper; private final boolean forceDocValuesSkipper; + private final boolean indexDisabledByDefault; private final SourceKeepMode indexSourceKeepMode; public Builder(final String name, final MappingParserContext mappingParserContext) { @@ -224,6 +225,7 @@ public Builder(final String name, final MappingParserContext mappingParserContex mappingParserContext.getIndexSettings().getIndexSortConfig(), USE_DOC_VALUES_SKIPPER.get(mappingParserContext.getSettings()), false, + mappingParserContext.getIndexSettings().isIndexDisabledByDefault(), mappingParserContext.getIndexSettings().sourceKeepMode() ); } @@ -246,6 +248,7 @@ public Builder(final String name, final MappingParserContext mappingParserContex null, false, false, + false, sourceKeepMode ); } @@ -260,9 +263,11 @@ private Builder( IndexSortConfig indexSortConfig, boolean enableDocValuesSkipper, boolean forceDocValuesSkipper, + boolean indexDisabledByDefault, SourceKeepMode indexSourceKeepMode ) { super(name); + this.indexed = Parameter.indexParam(m -> toType(m).indexed, indexDisabledByDefault == false); this.indexAnalyzers = indexAnalyzers; this.scriptCompiler = Objects.requireNonNull(scriptCompiler); this.indexCreatedVersion = Objects.requireNonNull(indexCreatedVersion); @@ -299,9 +304,26 @@ private Builder( this.indexMode = indexMode; this.enableDocValuesSkipper = enableDocValuesSkipper; this.forceDocValuesSkipper = forceDocValuesSkipper; + this.indexDisabledByDefault = indexDisabledByDefault; this.indexSourceKeepMode = indexSourceKeepMode; } + public Builder(String name, boolean indexDisabledByDefault, IndexVersion indexCreatedVersion) { + this( + name, + null, + ScriptCompiler.NONE, + Integer.MAX_VALUE, + indexCreatedVersion, + IndexMode.STANDARD, + null, + false, + false, + indexDisabledByDefault, + SourceKeepMode.NONE + ); + } + public Builder(String name, IndexVersion indexCreatedVersion) { this(name, null, ScriptCompiler.NONE, Integer.MAX_VALUE, indexCreatedVersion, SourceKeepMode.NONE); } @@ -323,6 +345,7 @@ public static Builder buildWithDocValuesSkipper( null, enableDocValuesSkipper, true, + false, SourceKeepMode.NONE ); } @@ -1124,6 +1147,7 @@ public String originalName() { private final IndexSortConfig indexSortConfig; private final boolean enableDocValuesSkipper; private final boolean forceDocValuesSkipper; + private final boolean indexDisabledByDefault; private final String offsetsFieldName; private final SourceKeepMode indexSourceKeepMode; private final String originalName; @@ -1156,6 +1180,7 @@ private KeywordFieldMapper( this.indexSortConfig = builder.indexSortConfig; this.enableDocValuesSkipper = builder.enableDocValuesSkipper; this.forceDocValuesSkipper = builder.forceDocValuesSkipper; + this.indexDisabledByDefault = builder.indexDisabledByDefault; this.offsetsFieldName = offsetsFieldName; this.indexSourceKeepMode = indexSourceKeepMode; this.originalName = mappedFieldType.originalName(); @@ -1313,6 +1338,7 @@ public FieldMapper.Builder getMergeBuilder() { indexSortConfig, enableDocValuesSkipper, forceDocValuesSkipper, + indexDisabledByDefault, indexSourceKeepMode ).dimension(fieldType().isDimension()).init(this); } 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 8711d39a23c08..209dde45ac442 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java @@ -132,6 +132,7 @@ public static final class Builder extends FieldMapper.DimensionBuilder { private final IndexMode indexMode; private final SourceKeepMode indexSourceKeepMode; + private final boolean indexDisabledByDefault; public Builder( String name, @@ -140,7 +141,8 @@ public Builder( Settings settings, IndexVersion indexCreatedVersion, IndexMode mode, - SourceKeepMode indexSourceKeepMode + SourceKeepMode indexSourceKeepMode, + boolean indexDisabledByDefault ) { this( name, @@ -150,12 +152,13 @@ public Builder( COERCE_SETTING.get(settings), indexCreatedVersion, mode, - indexSourceKeepMode + indexSourceKeepMode, + indexDisabledByDefault ); } public static Builder docValuesOnly(String name, NumberType type, IndexVersion indexCreatedVersion) { - Builder builder = new Builder(name, type, ScriptCompiler.NONE, false, false, indexCreatedVersion, null, null); + Builder builder = new Builder(name, type, ScriptCompiler.NONE, false, false, indexCreatedVersion, null, null, false); builder.indexed.setValue(false); builder.dimension.setValue(false); return builder; @@ -169,7 +172,8 @@ public Builder( boolean coerceByDefault, IndexVersion indexCreatedVersion, IndexMode mode, - SourceKeepMode indexSourceKeepMode + SourceKeepMode indexSourceKeepMode, + boolean indexDisabledByDefault ) { super(name); this.type = type; @@ -194,6 +198,10 @@ public Builder( ).acceptsNull(); this.indexMode = mode; this.indexed = Parameter.indexParam(m -> toType(m).indexed, () -> { + if (indexDisabledByDefault) { + return false; + } + if (indexMode == IndexMode.TIME_SERIES) { var metricType = getMetric().getValue(); return metricType != MetricType.COUNTER && metricType != MetricType.GAUGE; @@ -227,6 +235,7 @@ public Builder( addScriptValidation(script, indexed, hasDocValues); this.indexSourceKeepMode = indexSourceKeepMode; + this.indexDisabledByDefault = indexDisabledByDefault; } Builder nullValue(Number number) { @@ -1481,7 +1490,8 @@ private boolean isOutOfRange(Object value) { c.getSettings(), c.indexVersionCreated(), c.getIndexSettings().getMode(), - c.getIndexSettings().sourceKeepMode() + c.getIndexSettings().sourceKeepMode(), + c.getIndexSettings().isIndexDisabledByDefault() ) ); } @@ -2099,6 +2109,7 @@ public MetricType getMetricType() { private final IndexMode indexMode; private final SourceKeepMode indexSourceKeepMode; + private final boolean indexDisabledByDefault; private NumberFieldMapper( String simpleName, @@ -2129,6 +2140,7 @@ private NumberFieldMapper( this.indexMode = builder.indexMode; this.offsetsFieldName = offsetsFieldName; this.indexSourceKeepMode = builder.indexSourceKeepMode; + this.indexDisabledByDefault = builder.indexDisabledByDefault; } boolean coerce() { @@ -2260,7 +2272,8 @@ public FieldMapper.Builder getMergeBuilder() { coerceByDefault, indexCreatedVersion, indexMode, - indexSourceKeepMode + indexSourceKeepMode, + indexDisabledByDefault ).dimension(dimension).metric(metricType).allowMultipleValues(allowMultipleValues).init(this); } 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 f70a47caa080c..b5f42a0727545 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 @@ -140,7 +140,7 @@ public static class Builder extends FieldMapper.Builder { } }); - private final Parameter indexed = Parameter.indexParam(m -> builder(m).indexed.get(), true); + private final Parameter indexed; private final Parameter hasDocValues = Parameter.docValuesParam(m -> builder(m).hasDocValues.get(), true); private final Parameter nullValue = Parameter.stringParam("null_value", false, m -> builder(m).nullValue.get(), null) @@ -154,6 +154,7 @@ public static class Builder extends FieldMapper.Builder { ); private final int ignoreAboveDefault; private final Parameter ignoreAbove; + private final boolean indexDisabledByDefault; private final Parameter indexOptions = TextParams.keywordIndexOptions(m -> builder(m).indexOptions.get()); private final Parameter similarity = TextParams.similarity(m -> builder(m).similarity.get()); @@ -164,20 +165,7 @@ public static class Builder extends FieldMapper.Builder { m -> builder(m).splitQueriesOnWhitespace.get(), false ); - private final Parameter> dimensions = dimensionsParam(m -> builder(m).dimensions.get()).addValidator(v -> { - if (v.isEmpty() == false && (indexed.getValue() == false || hasDocValues.getValue() == false)) { - throw new IllegalArgumentException( - "Field [" - + TIME_SERIES_DIMENSIONS_ARRAY_PARAM - + "] requires that [" - + indexed.name - + "] and [" - + hasDocValues.name - + "] are true" - ); - } - }); - + private final Parameter> dimensions; private final Parameter> meta = Parameter.metaParam(); public static FieldMapper.Parameter> dimensionsParam(Function> initializer) { @@ -185,11 +173,25 @@ public static FieldMapper.Parameter> dimensionsParam(Function builder(m).indexed.get(), indexDisabledByDefault == false); + this.dimensions = dimensionsParam(m -> builder(m).dimensions.get()).addValidator(v -> { + if (v.isEmpty() == false && (indexed.getValue() == false || hasDocValues.getValue() == false)) { + throw new IllegalArgumentException( + "Field [" + + TIME_SERIES_DIMENSIONS_ARRAY_PARAM + + "] requires that [" + + indexed.name + + "] and [" + + hasDocValues.name + + "] are true" + ); + } + }); this.ignoreAboveDefault = ignoreAboveDefault; this.ignoreAbove = Parameter.intParam("ignore_above", true, m -> builder(m).ignoreAbove.get(), ignoreAboveDefault) .addValidator(v -> { @@ -198,6 +200,7 @@ private Builder(String name, int ignoreAboveDefault) { } }); this.dimensions.precludesParameters(ignoreAbove); + this.indexDisabledByDefault = indexDisabledByDefault; } @Override @@ -239,7 +242,9 @@ public FlattenedFieldMapper build(MapperBuilderContext context) { } } - public static final TypeParser PARSER = new TypeParser((n, c) -> new Builder(n, IGNORE_ABOVE_SETTING.get(c.getSettings()))); + public static final TypeParser PARSER = new TypeParser( + (n, c) -> new Builder(n, IGNORE_ABOVE_SETTING.get(c.getSettings()), c.getIndexSettings().isIndexDisabledByDefault()) + ); /** * A field type that represents the values under a particular JSON key, used @@ -827,6 +832,7 @@ public void validateMatchedRoutingPath(final String routingPath) { private final FlattenedFieldParser fieldParser; private final Builder builder; + private final boolean indexDisabledByDefault; private FlattenedFieldMapper( String leafName, @@ -848,6 +854,7 @@ private FlattenedFieldMapper( builder.ignoreAbove.get(), builder.nullValue.get() ); + this.indexDisabledByDefault = builder.indexDisabledByDefault; } @Override @@ -905,7 +912,7 @@ protected void parseCreateField(DocumentParserContext context) throws IOExceptio @Override public FieldMapper.Builder getMergeBuilder() { - return new Builder(leafName(), ignoreAboveDefault).init(this); + return new Builder(leafName(), ignoreAboveDefault, indexDisabledByDefault).init(this); } @Override 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 8e60895cdbca7..9b8f7ea5ba579 100644 --- a/server/src/test/java/org/elasticsearch/index/fielddata/AbstractFieldDataTestCase.java +++ b/server/src/test/java/org/elasticsearch/index/fielddata/AbstractFieldDataTestCase.java @@ -107,7 +107,8 @@ public > IFD getForField(String type, String field true, IndexVersion.current(), null, - null + null, + false ).docValues(docValues).build(context).fieldType(); } else if (type.equals("half_float")) { fieldType = new NumberFieldMapper.Builder( @@ -118,7 +119,8 @@ public > IFD getForField(String type, String field true, IndexVersion.current(), null, - null + null, + false ).docValues(docValues).build(context).fieldType(); } else if (type.equals("double")) { fieldType = new NumberFieldMapper.Builder( @@ -129,7 +131,8 @@ public > IFD getForField(String type, String field true, IndexVersion.current(), null, - null + null, + false ).docValues(docValues).build(context).fieldType(); } else if (type.equals("long")) { fieldType = new NumberFieldMapper.Builder( @@ -140,7 +143,8 @@ public > IFD getForField(String type, String field true, IndexVersion.current(), null, - null + null, + false ).docValues(docValues).build(context).fieldType(); } else if (type.equals("int")) { fieldType = new NumberFieldMapper.Builder( @@ -151,7 +155,8 @@ public > IFD getForField(String type, String field true, IndexVersion.current(), null, - null + null, + false ).docValues(docValues).build(context).fieldType(); } else if (type.equals("short")) { fieldType = new NumberFieldMapper.Builder( @@ -162,7 +167,8 @@ public > IFD getForField(String type, String field true, IndexVersion.current(), null, - null + null, + false ).docValues(docValues).build(context).fieldType(); } else if (type.equals("byte")) { fieldType = new NumberFieldMapper.Builder( @@ -173,12 +179,14 @@ public > IFD getForField(String type, String field true, IndexVersion.current(), null, - null + null, + false ).docValues(docValues).build(context).fieldType(); } else if (type.equals("geo_point")) { - fieldType = new GeoPointFieldMapper.Builder(fieldName, ScriptCompiler.NONE, false, IndexVersion.current(), null).docValues( - docValues - ).build(context).fieldType(); + fieldType = new GeoPointFieldMapper.Builder(fieldName, ScriptCompiler.NONE, false, IndexVersion.current(), null, false) + .docValues(docValues) + .build(context) + .fieldType(); } else if (type.equals("binary")) { fieldType = new BinaryFieldMapper.Builder(fieldName, SourceFieldMapper.isSynthetic(indexService.getIndexSettings())).docValues( docValues 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 d55f712cb91b6..ca1da49bd22fb 100644 --- a/server/src/test/java/org/elasticsearch/index/fielddata/IndexFieldDataServiceTests.java +++ b/server/src/test/java/org/elasticsearch/index/fielddata/IndexFieldDataServiceTests.java @@ -85,15 +85,18 @@ public void testGetForFieldDefaults() { assertTrue(fd instanceof SortedSetOrdinalsIndexFieldData); for (MappedFieldType mapper : Arrays.asList( - new NumberFieldMapper.Builder("int", BYTE, ScriptCompiler.NONE, false, true, IndexVersion.current(), null, null).build(context) - .fieldType(), - new NumberFieldMapper.Builder("int", SHORT, ScriptCompiler.NONE, false, true, IndexVersion.current(), null, null).build(context) - .fieldType(), - new NumberFieldMapper.Builder("int", INTEGER, ScriptCompiler.NONE, false, true, IndexVersion.current(), null, null).build( + new NumberFieldMapper.Builder("int", BYTE, ScriptCompiler.NONE, false, true, IndexVersion.current(), null, null, false).build( + context + ).fieldType(), + new NumberFieldMapper.Builder("int", SHORT, ScriptCompiler.NONE, false, true, IndexVersion.current(), null, null, false).build( context ).fieldType(), - new NumberFieldMapper.Builder("long", LONG, ScriptCompiler.NONE, false, true, IndexVersion.current(), null, null).build(context) - .fieldType() + new NumberFieldMapper.Builder("int", INTEGER, ScriptCompiler.NONE, false, true, IndexVersion.current(), null, null, false) + .build(context) + .fieldType(), + new NumberFieldMapper.Builder("long", LONG, ScriptCompiler.NONE, false, true, IndexVersion.current(), null, null, false).build( + context + ).fieldType() )) { ifdService.clear(); fd = ifdService.getForField(mapper, FieldDataContext.noRuntimeFields("test")); @@ -108,7 +111,8 @@ public void testGetForFieldDefaults() { true, IndexVersion.current(), null, - null + null, + false ).build(context).fieldType(); ifdService.clear(); fd = ifdService.getForField(floatMapper, FieldDataContext.noRuntimeFields("test")); @@ -122,7 +126,8 @@ public void testGetForFieldDefaults() { true, IndexVersion.current(), null, - null + null, + false ).build(context).fieldType(); ifdService.clear(); fd = ifdService.getForField(doubleMapper, FieldDataContext.noRuntimeFields("test")); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java index 47161239a363d..85ef6afa78d8e 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java @@ -10,6 +10,7 @@ package org.elasticsearch.index.mapper; import org.apache.lucene.index.DocValuesType; +import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.IndexableField; import org.apache.lucene.index.LeafReader; import org.apache.lucene.index.SortedNumericDocValues; @@ -90,6 +91,33 @@ public void testDefaults() throws IOException { }); } + public void testNotIndexed() throws Exception { + DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> { + minimalMapping(b); + b.field("index", false); + })); + ParsedDocument doc = mapper.parse(source(this::writeField)); + + List fields = doc.rootDoc().getFields("field"); + assertEquals(1, fields.size()); + IndexableField field = fields.get(0); + assertEquals(IndexOptions.NONE, fields.get(0).fieldType().indexOptions()); + assertEquals(DocValuesType.SORTED_NUMERIC, field.fieldType().docValuesType()); + } + + public void testDisableDefaultIndex() throws IOException { + var settings = Settings.builder().put(IndexSettings.INDEX_DISABLED_BY_DEFAULT.getKey(), true).build(); + var mapperService = createMapperService(settings, fieldMapping(this::minimalMapping)); + var documentMapper = mapperService.documentMapper(); + ParsedDocument doc = documentMapper.parse(source(this::writeField)); + + List fields = doc.rootDoc().getFields("field"); + assertEquals(1, fields.size()); + IndexableField field = fields.get(0); + assertEquals(IndexOptions.NONE, fields.get(0).fieldType().indexOptions()); + assertEquals(DocValuesType.SORTED_NUMERIC, field.fieldType().docValuesType()); + } + public void testSerialization() throws IOException { DocumentMapper defaultMapper = createDocumentMapper(fieldMapping(this::minimalMapping)); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/BooleanScriptFieldTypeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/BooleanScriptFieldTypeTests.java index 54656ab1af3ee..10f1f992731be 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/BooleanScriptFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/BooleanScriptFieldTypeTests.java @@ -362,9 +362,8 @@ protected Query randomTermsQuery(MappedFieldType ft, SearchExecutionContext ctx) } public void testDualingQueries() throws IOException { - BooleanFieldMapper ootb = new BooleanFieldMapper.Builder("foo", ScriptCompiler.NONE, false, IndexVersion.current(), null).build( - MapperBuilderContext.root(false, false) - ); + BooleanFieldMapper ootb = new BooleanFieldMapper.Builder("foo", ScriptCompiler.NONE, false, IndexVersion.current(), null, false) + .build(MapperBuilderContext.root(false, false)); try (Directory directory = newDirectory(); RandomIndexWriter iw = new RandomIndexWriter(random(), directory)) { List values = randomList(0, 2, ESTestCase::randomBoolean); String source = "{\"foo\": " + values + "}"; diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java index f0e384d1cf272..1b812e7c12ae9 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java @@ -127,8 +127,21 @@ public void testNotIndexed() throws Exception { List fields = doc.rootDoc().getFields("field"); assertEquals(1, fields.size()); - IndexableField dvField = fields.get(0); - assertEquals(DocValuesType.SORTED_NUMERIC, dvField.fieldType().docValuesType()); + IndexableField field = fields.getFirst(); + assertEquals(0, field.fieldType().pointIndexDimensionCount()); + assertEquals(DocValuesType.SORTED_NUMERIC, field.fieldType().docValuesType()); + } + + public void testDisableDefaultIndex() throws IOException { + var settings = Settings.builder().put(IndexSettings.INDEX_DISABLED_BY_DEFAULT.getKey(), true).build(); + var mapperService = createMapperService(settings, fieldMapping(b -> b.field("type", "date"))); + var documentMapper = mapperService.documentMapper(); + ParsedDocument doc = documentMapper.parse(source(b -> b.field("field", "2016-03-11"))); + List fields = doc.rootDoc().getFields("field"); + assertEquals(1, fields.size()); + IndexableField field = fields.getFirst(); + assertEquals(0, field.fieldType().pointIndexDimensionCount()); + assertEquals(DocValuesType.SORTED_NUMERIC, field.fieldType().docValuesType()); } public void testNoDocValues() throws Exception { diff --git a/server/src/test/java/org/elasticsearch/index/mapper/FieldAliasMapperValidationTests.java b/server/src/test/java/org/elasticsearch/index/mapper/FieldAliasMapperValidationTests.java index 132d24f2389bf..9ce238f82c16c 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/FieldAliasMapperValidationTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/FieldAliasMapperValidationTests.java @@ -160,7 +160,7 @@ public void testFieldAliasWithDifferentNestedScopes() { } private static FieldMapper createFieldMapper(String parent, String name) { - return new BooleanFieldMapper.Builder(name, ScriptCompiler.NONE, false, IndexVersion.current(), null).build( + return new BooleanFieldMapper.Builder(name, ScriptCompiler.NONE, false, IndexVersion.current(), null, false).build( new MapperBuilderContext( parent, false, 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..66d569f2b60f6 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldMapperTests.java @@ -11,12 +11,14 @@ import org.apache.lucene.document.LatLonDocValuesField; import org.apache.lucene.document.LatLonPoint; import org.apache.lucene.geo.GeoEncodingUtils; +import org.apache.lucene.index.DocValuesType; import org.apache.lucene.index.IndexableField; import org.apache.lucene.util.BytesRef; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.common.Strings; import org.elasticsearch.common.geo.GeoJson; import org.elasticsearch.common.geo.GeoPoint; +import org.elasticsearch.common.settings.Settings; import org.elasticsearch.geo.GeometryTestUtils; import org.elasticsearch.geometry.Point; import org.elasticsearch.geometry.utils.WellKnownText; @@ -362,6 +364,33 @@ public void testIndexParameter() throws Exception { assertThat(((GeoPointFieldMapper) fieldMapper).fieldType().isSearchable(), equalTo(true)); } + public void testNotIndexed() throws Exception { + DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> { + b.field("type", "geo_point"); + b.field("index", false); + })); + + ParsedDocument doc = mapper.parse(source(b -> b.field("field", "1.2,1.3"))); + List fields = doc.rootDoc().getFields("field"); + assertEquals(1, fields.size()); + IndexableField field = fields.get(0); + assertEquals(0, field.fieldType().pointIndexDimensionCount()); + assertEquals(DocValuesType.SORTED_NUMERIC, field.fieldType().docValuesType()); + } + + public void testDisableDefaultIndex() throws IOException { + var settings = Settings.builder().put(IndexSettings.INDEX_DISABLED_BY_DEFAULT.getKey(), true).build(); + var mapperService = createMapperService(settings, fieldMapping(this::minimalMapping)); + var documentMapper = mapperService.documentMapper(); + ParsedDocument doc = documentMapper.parse(source(b -> b.field("field", "1.2,1.3"))); + + List fields = doc.rootDoc().getFields("field"); + assertEquals(1, fields.size()); + IndexableField field = fields.get(0); + assertEquals(0, field.fieldType().pointIndexDimensionCount()); + assertEquals(DocValuesType.SORTED_NUMERIC, field.fieldType().docValuesType()); + } + public void testMultiField() throws Exception { DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> { b.field("type", "geo_point").field("doc_values", false); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldTypeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldTypeTests.java index 93f1b2b977b0f..095363c842c87 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldTypeTests.java @@ -34,7 +34,8 @@ public void testFetchSourceValue() throws IOException { ScriptCompiler.NONE, ignoreMalformed, IndexVersion.current(), - null + null, + false ).build(MapperBuilderContext.root(false, false)).fieldType(); Map jsonPoint = Map.of("type", "Point", "coordinates", List.of(42.0, 27.1)); @@ -116,9 +117,9 @@ public void testFetchSourceValue() throws IOException { } public void testFetchVectorTile() throws IOException { - MappedFieldType mapper = new GeoPointFieldMapper.Builder("field", ScriptCompiler.NONE, false, IndexVersion.current(), null).build( - MapperBuilderContext.root(false, false) - ).fieldType(); + MappedFieldType mapper = new GeoPointFieldMapper.Builder("field", ScriptCompiler.NONE, false, IndexVersion.current(), null, false) + .build(MapperBuilderContext.root(false, false)) + .fieldType(); final int z = randomIntBetween(1, 10); int x = randomIntBetween(0, (1 << z) - 1); int y = randomIntBetween(0, (1 << z) - 1); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/IpFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/IpFieldMapperTests.java index 2ca2a7f8eb62d..7bdcb1c29dfa8 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/IpFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/IpFieldMapperTests.java @@ -18,8 +18,10 @@ import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.network.InetAddresses; import org.elasticsearch.common.network.NetworkAddress; +import org.elasticsearch.common.settings.Settings; import org.elasticsearch.core.Tuple; import org.elasticsearch.index.IndexMode; +import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.IndexVersion; import org.elasticsearch.index.IndexVersions; import org.elasticsearch.script.IpFieldScript; @@ -97,18 +99,30 @@ public void testDefaults() throws Exception { } public void testNotIndexed() throws Exception { - DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> { b.field("type", "ip"); b.field("index", false); })); ParsedDocument doc = mapper.parse(source(b -> b.field("field", "::1"))); + List fields = doc.rootDoc().getFields("field"); + assertEquals(1, fields.size()); + IndexableField field = fields.get(0); + assertEquals(0, field.fieldType().pointIndexDimensionCount()); + assertEquals(DocValuesType.SORTED_SET, field.fieldType().docValuesType()); + } + + public void testDisableDefaultIndex() throws IOException { + var settings = Settings.builder().put(IndexSettings.INDEX_DISABLED_BY_DEFAULT.getKey(), true).build(); + var mapperService = createMapperService(settings, fieldMapping(this::minimalMapping)); + var documentMapper = mapperService.documentMapper(); + ParsedDocument doc = documentMapper.parse(source(b -> b.field("field", "::1"))); List fields = doc.rootDoc().getFields("field"); assertEquals(1, fields.size()); - IndexableField dvField = fields.get(0); - assertEquals(DocValuesType.SORTED_SET, dvField.fieldType().docValuesType()); + IndexableField field = fields.get(0); + assertEquals(0, field.fieldType().pointIndexDimensionCount()); + assertEquals(DocValuesType.SORTED_SET, field.fieldType().docValuesType()); } public void testNoDocValues() throws Exception { 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..bcc378f7e24a8 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/IpFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/IpFieldTypeTests.java @@ -356,7 +356,8 @@ public void testFetchSourceValue() throws IOException { ScriptCompiler.NONE, true, IndexVersion.current(), - Mapper.SourceKeepMode.NONE + Mapper.SourceKeepMode.NONE, + false ).build(MapperBuilderContext.root(false, false)).fieldType(); assertEquals(List.of("2001:db8::2:1"), fetchSourceValue(mapper, "2001:db8::2:1")); assertEquals(List.of("2001:db8::2:1"), fetchSourceValue(mapper, "2001:db8:0:0:0:0:2:1")); @@ -367,7 +368,8 @@ public void testFetchSourceValue() throws IOException { ScriptCompiler.NONE, true, IndexVersion.current(), - Mapper.SourceKeepMode.NONE + Mapper.SourceKeepMode.NONE, + false ).nullValue("2001:db8:0:0:0:0:2:7").build(MapperBuilderContext.root(false, false)).fieldType(); assertEquals(List.of("2001:db8::2:7"), fetchSourceValue(nullValueMapper, 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 f6a7148c71091..73d9d4086f088 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java @@ -275,6 +275,17 @@ public void testDisableIndex() throws IOException { assertEquals(DocValuesType.SORTED_SET, fields.get(0).fieldType().docValuesType()); } + public void testDisableDefaultIndex() throws IOException { + var settings = Settings.builder().put(IndexSettings.INDEX_DISABLED_BY_DEFAULT.getKey(), true).build(); + var mapperService = createMapperService(settings, fieldMapping(b -> b.field("type", "keyword"))); + var documentMapper = mapperService.documentMapper(); + ParsedDocument doc = documentMapper.parse(source(b -> b.field("field", "1234"))); + List fields = doc.rootDoc().getFields("field"); + assertEquals(1, fields.size()); + assertEquals(IndexOptions.NONE, fields.get(0).fieldType().indexOptions()); + assertEquals(DocValuesType.SORTED_SET, fields.get(0).fieldType().docValuesType()); + } + public void testDisableDocValues() throws IOException { DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> b.field("type", "keyword").field("doc_values", false))); ParsedDocument doc = mapper.parse(source(b -> b.field("field", "1234"))); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldsSerializationTests.java b/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldsSerializationTests.java index 14781f62a23ca..0a38835e203af 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldsSerializationTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/MultiFieldsSerializationTests.java @@ -38,10 +38,10 @@ public void testSorting() { sortedNames.sort(Comparator.naturalOrder()); for (String name : names) { - builder.add(new BooleanFieldMapper.Builder(name, ScriptCompiler.NONE, false, IndexVersion.current(), null)); + builder.add(new BooleanFieldMapper.Builder(name, ScriptCompiler.NONE, false, IndexVersion.current(), null, false)); } - Mapper.Builder root = new BooleanFieldMapper.Builder("root", ScriptCompiler.NONE, false, IndexVersion.current(), null); + Mapper.Builder root = new BooleanFieldMapper.Builder("root", ScriptCompiler.NONE, false, IndexVersion.current(), null, false); FieldMapper.MultiFields multiFields = builder.build(root, MapperBuilderContext.root(false, false)); String serialized = Strings.toString(multiFields); 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..5e33ab6ea9a0c 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/NumberFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/NumberFieldTypeTests.java @@ -944,7 +944,8 @@ public void testFetchSourceValue() throws IOException { true, IndexVersion.current(), null, - null + null, + false ).build(MapperBuilderContext.root(false, false)).fieldType(); assertEquals(List.of(3), fetchSourceValue(mapper, 3.14)); assertEquals(List.of(42), fetchSourceValue(mapper, "42.9")); @@ -958,7 +959,8 @@ public void testFetchSourceValue() throws IOException { true, IndexVersion.current(), null, - null + null, + false ).nullValue(2.71f).build(MapperBuilderContext.root(false, false)).fieldType(); assertEquals(List.of(2.71f), fetchSourceValue(nullValueMapper, "")); assertEquals(List.of(2.71f), fetchSourceValue(nullValueMapper, null)); @@ -973,7 +975,8 @@ public void testFetchHalfFloatFromSource() throws IOException { true, IndexVersion.current(), null, - null + null, + false ).build(MapperBuilderContext.root(false, false)).fieldType(); /* * Half float loses a fair bit of precision compared to float but 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 7402405f5b883..a4f4149111d38 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ObjectMapperMergeTests.java @@ -337,7 +337,8 @@ public void testConflictingDynamicUpdate() { true, IndexVersion.current(), null, - null + null, + false ) ).build(MapperBuilderContext.root(false, false)); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapperTests.java index 7f695b1581fbf..14213ec8be9c4 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapperTests.java @@ -244,6 +244,20 @@ public void testDisableIndex() throws Exception { assertEquals(DocValuesType.SORTED_SET, keyedFields.get(0).fieldType().docValuesType()); } + public void testDisableDefaultIndex() throws IOException { + var settings = Settings.builder().put(IndexSettings.INDEX_DISABLED_BY_DEFAULT.getKey(), true).build(); + var mapperService = createMapperService(settings, fieldMapping(b -> b.field("type", "flattened"))); + var documentMapper = mapperService.documentMapper(); + ParsedDocument doc = documentMapper.parse(source(b -> b.startObject("field").field("key", "value").endObject())); + List fields = doc.rootDoc().getFields("field"); + assertEquals(1, fields.size()); + assertEquals(DocValuesType.SORTED_SET, fields.get(0).fieldType().docValuesType()); + + List keyedFields = doc.rootDoc().getFields("field._keyed"); + assertEquals(1, keyedFields.size()); + assertEquals(DocValuesType.SORTED_SET, keyedFields.get(0).fieldType().docValuesType()); + } + public void testDisableDocValues() throws Exception { DocumentMapper mapper = createDocumentMapper(fieldMapping(b -> { 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..6f4651e13a74b 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 @@ -13,6 +13,7 @@ import org.apache.lucene.index.IndexableField; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.common.Strings; +import org.elasticsearch.common.settings.Settings; import org.elasticsearch.core.Tuple; import org.elasticsearch.index.IndexMode; import org.elasticsearch.index.IndexSettings; @@ -123,8 +124,22 @@ public void testNotIndexed() throws Exception { List fields = doc.rootDoc().getFields("field"); assertEquals(1, fields.size()); - IndexableField dvField = fields.get(0); - assertEquals(DocValuesType.SORTED_NUMERIC, dvField.fieldType().docValuesType()); + IndexableField field = fields.get(0); + assertEquals(0, field.fieldType().pointIndexDimensionCount()); + assertEquals(DocValuesType.SORTED_NUMERIC, field.fieldType().docValuesType()); + } + + public void testDisableDefaultIndex() throws IOException { + var settings = Settings.builder().put(IndexSettings.INDEX_DISABLED_BY_DEFAULT.getKey(), true).build(); + var mapperService = createMapperService(settings, fieldMapping(this::minimalMapping)); + var documentMapper = mapperService.documentMapper(); + ParsedDocument doc = documentMapper.parse(source(b -> b.field("field", 123))); + + List fields = doc.rootDoc().getFields("field"); + assertEquals(1, fields.size()); + IndexableField field = fields.get(0); + assertEquals(0, field.fieldType().pointIndexDimensionCount()); + assertEquals(DocValuesType.SORTED_NUMERIC, field.fieldType().docValuesType()); } public void testNoDocValues() throws Exception { 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 3658313642700..779324b337470 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 @@ -169,13 +169,15 @@ public static final class Builder extends FieldMapper.Builder { private final IndexVersion indexCreatedVersion; private final IndexMode indexMode; private final SourceKeepMode indexSourceKeepMode; + private final boolean indexDisabledByDefault; public Builder( String name, Boolean ignoreMalformedByDefault, IndexVersion indexCreatedVersion, IndexMode mode, - SourceKeepMode indexSourceKeepMode + SourceKeepMode indexSourceKeepMode, + boolean indexDisabledByDefault ) { super(name); this.ignoreMalformed = Parameter.boolParam( @@ -189,6 +191,7 @@ public Builder( this.indexCreatedVersion = Objects.requireNonNull(indexCreatedVersion); this.indexMode = mode; this.indexSourceKeepMode = indexSourceKeepMode; + this.indexDisabledByDefault = indexDisabledByDefault; } @Override @@ -247,7 +250,8 @@ public AggregateMetricDoubleFieldMapper build(MapperBuilderContext context) { false, indexCreatedVersion, indexMode, - indexSourceKeepMode + indexSourceKeepMode, + indexDisabledByDefault ).allowMultipleValues(false); } else { builder = new NumberFieldMapper.Builder( @@ -258,7 +262,8 @@ public AggregateMetricDoubleFieldMapper build(MapperBuilderContext context) { true, indexCreatedVersion, indexMode, - indexSourceKeepMode + indexSourceKeepMode, + indexDisabledByDefault ).allowMultipleValues(false); } NumberFieldMapper fieldMapper = builder.build(context); @@ -289,7 +294,8 @@ public AggregateMetricDoubleFieldMapper build(MapperBuilderContext context) { IGNORE_MALFORMED_SETTING.get(c.getSettings()), c.indexVersionCreated(), c.getIndexSettings().getMode(), - c.getIndexSettings().sourceKeepMode() + c.getIndexSettings().sourceKeepMode(), + c.getIndexSettings().isIndexDisabledByDefault() ), notInMultiFields(CONTENT_TYPE) ); @@ -694,6 +700,7 @@ public MetricType getMetricType() { private final IndexMode indexMode; private final SourceKeepMode indexSourceKeepMode; + private final boolean indexDisabledByDefault; private AggregateMetricDoubleFieldMapper( String simpleName, @@ -712,6 +719,7 @@ private AggregateMetricDoubleFieldMapper( this.indexCreatedVersion = builder.indexCreatedVersion; this.indexMode = builder.indexMode; this.indexSourceKeepMode = builder.indexSourceKeepMode; + this.indexDisabledByDefault = builder.indexDisabledByDefault; } @Override @@ -865,8 +873,14 @@ protected void parseCreateField(DocumentParserContext context) throws IOExceptio @Override public FieldMapper.Builder getMergeBuilder() { - return new Builder(leafName(), ignoreMalformedByDefault, indexCreatedVersion, indexMode, indexSourceKeepMode).metric(metricType) - .init(this); + return new Builder( + leafName(), + ignoreMalformedByDefault, + indexCreatedVersion, + indexMode, + indexSourceKeepMode, + indexDisabledByDefault + ).metric(metricType).init(this); } @Override 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 5061c8e303514..065bda1dfb9c6 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 @@ -106,15 +106,17 @@ public static final class Builder extends FieldMapper.DimensionBuilder { private final IndexVersion indexCreatedVersion; private final IndexMode indexMode; private final SourceKeepMode indexSourceKeepMode; + private final boolean indexDisabledByDefault; public Builder( String name, Settings settings, IndexVersion indexCreatedVersion, IndexMode mode, - SourceKeepMode indexSourceKeepMode + SourceKeepMode indexSourceKeepMode, + boolean indexDisabledByDefault ) { - this(name, IGNORE_MALFORMED_SETTING.get(settings), indexCreatedVersion, mode, indexSourceKeepMode); + this(name, IGNORE_MALFORMED_SETTING.get(settings), indexCreatedVersion, mode, indexSourceKeepMode, indexDisabledByDefault); } public Builder( @@ -122,7 +124,8 @@ public Builder( boolean ignoreMalformedByDefault, IndexVersion indexCreatedVersion, IndexMode mode, - SourceKeepMode indexSourceKeepMode + SourceKeepMode indexSourceKeepMode, + boolean indexDisabledByDefault ) { super(name); this.ignoreMalformed = Parameter.explicitBoolParam( @@ -142,6 +145,10 @@ public Builder( ).acceptsNull(); this.indexMode = mode; this.indexed = Parameter.indexParam(m -> toType(m).indexed, () -> { + if (indexDisabledByDefault) { + return false; + } + if (indexMode == IndexMode.TIME_SERIES) { var metricType = getMetric().getValue(); return metricType != MetricType.COUNTER && metricType != MetricType.GAUGE; @@ -173,6 +180,7 @@ public Builder( this.indexCreatedVersion = indexCreatedVersion; this.indexSourceKeepMode = indexSourceKeepMode; + this.indexDisabledByDefault = indexDisabledByDefault; } private String parseNullValueAsString(Object o) { @@ -260,7 +268,8 @@ public UnsignedLongFieldMapper build(MapperBuilderContext context) { c.getSettings(), c.indexVersionCreated(), c.getIndexSettings().getMode(), - c.getIndexSettings().sourceKeepMode() + c.getIndexSettings().sourceKeepMode(), + c.getIndexSettings().isIndexDisabledByDefault() ) ); @@ -693,6 +702,7 @@ public MetricType getMetricType() { private final IndexMode indexMode; private final String offsetsFieldName; private final SourceKeepMode indexSourceKeepMode; + private final boolean indexDisabledByDefault; private UnsignedLongFieldMapper( String simpleName, @@ -722,6 +732,7 @@ private UnsignedLongFieldMapper( this.indexCreatedVersion = builder.indexCreatedVersion; this.offsetsFieldName = offsetsFieldName; this.indexSourceKeepMode = builder.indexSourceKeepMode; + this.indexDisabledByDefault = builder.indexDisabledByDefault; } @Override @@ -816,9 +827,14 @@ protected void parseCreateField(DocumentParserContext context) throws IOExceptio @Override public FieldMapper.Builder getMergeBuilder() { - return new Builder(leafName(), ignoreMalformedByDefault, indexCreatedVersion, indexMode, indexSourceKeepMode).dimension(dimension) - .metric(metricType) - .init(this); + return new Builder( + leafName(), + ignoreMalformedByDefault, + indexCreatedVersion, + indexMode, + indexSourceKeepMode, + indexDisabledByDefault + ).dimension(dimension).metric(metricType).init(this); } /** 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..b469b6ac2d80b 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 @@ -169,7 +169,7 @@ public void testParseUpperTermForRangeQuery() { } public void testFetchSourceValue() throws IOException { - MappedFieldType mapper = new UnsignedLongFieldMapper.Builder("field", false, null, null, null).build( + MappedFieldType mapper = new UnsignedLongFieldMapper.Builder("field", false, null, null, null, false).build( MapperBuilderContext.root(false, false) ).fieldType(); assertEquals(List.of(0L), fetchSourceValue(mapper, 0L)); @@ -177,7 +177,7 @@ public void testFetchSourceValue() throws IOException { assertEquals(List.of(BIGINTEGER_2_64_MINUS_ONE), fetchSourceValue(mapper, "18446744073709551615")); assertEquals(List.of(), fetchSourceValue(mapper, "")); - MappedFieldType nullValueMapper = new UnsignedLongFieldMapper.Builder("field", false, null, null, null).nullValue( + MappedFieldType nullValueMapper = new UnsignedLongFieldMapper.Builder("field", false, null, null, null, false).nullValue( "18446744073709551615" ).build(MapperBuilderContext.root(false, false)).fieldType(); assertEquals(List.of(BIGINTEGER_2_64_MINUS_ONE), fetchSourceValue(nullValueMapper, "")); 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..7bf85bee2add8 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 @@ -721,7 +721,8 @@ private Map createFieldTypes(RollupJobConfig job) { false, IndexVersion.current(), null, - null + null, + false ).build(MapperBuilderContext.root(false, false)).fieldType(); fieldTypes.put(ft.name(), ft); } @@ -746,7 +747,8 @@ private Map createFieldTypes(RollupJobConfig job) { false, IndexVersion.current(), null, - null + null, + false ).build(MapperBuilderContext.root(false, false)).fieldType(); fieldTypes.put(ft.name(), ft); }