diff --git a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java index 705c3a5beb99d..522c5ec3e2016 100644 --- a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java +++ b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java @@ -73,6 +73,10 @@ public class ScaledFloatFieldMapper extends FieldMapper { public static final String CONTENT_TYPE = "scaled_float"; // use the same default as numbers private static final Setting COERCE_SETTING = NumberFieldMapper.COERCE_SETTING; + private static final FieldType FIELD_TYPE = new FieldType(); + static { + FIELD_TYPE.setIndexOptions(IndexOptions.DOCS); + } public static class Builder extends FieldMapper.Builder { @@ -83,7 +87,7 @@ public static class Builder extends FieldMapper.Builder { private Double nullValue; public Builder(String name) { - super(name, new FieldType()); + super(name, FIELD_TYPE); builder = this; } diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeatureFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeatureFieldMapperTests.java index cf285c0fda999..5fa95e6e15f2f 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeatureFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeatureFieldMapperTests.java @@ -45,7 +45,7 @@ public class RankFeatureFieldMapperTests extends FieldMapperTestCase unsupportedProperties() { - return Set.of("analyzer", "similarity", "store", "doc_values"); + return Set.of("analyzer", "similarity", "store", "doc_values", "index"); } @Before diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeaturesFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeaturesFieldMapperTests.java index 0a1f6423cc5ce..78f22e76702df 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeaturesFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/RankFeaturesFieldMapperTests.java @@ -40,7 +40,7 @@ public class RankFeaturesFieldMapperTests extends FieldMapperTestCase unsupportedProperties() { - return Set.of("analyzer", "similarity", "store", "doc_values"); + return Set.of("analyzer", "similarity", "store", "doc_values", "index"); } IndexService indexService; diff --git a/plugins/analysis-icu/src/main/java/org/elasticsearch/index/mapper/ICUCollationKeywordFieldMapper.java b/plugins/analysis-icu/src/main/java/org/elasticsearch/index/mapper/ICUCollationKeywordFieldMapper.java index aff74a999896f..20bdada5569f3 100644 --- a/plugins/analysis-icu/src/main/java/org/elasticsearch/index/mapper/ICUCollationKeywordFieldMapper.java +++ b/plugins/analysis-icu/src/main/java/org/elasticsearch/index/mapper/ICUCollationKeywordFieldMapper.java @@ -659,7 +659,7 @@ protected void mergeOptions(FieldMapper other, List conflicts) { @Override protected void doXContentBody(XContentBuilder builder, boolean includeDefaults, Params params) throws IOException { super.doXContentBody(builder, includeDefaults, params); - if (includeDefaults || (mappedFieldType.isSearchable() && fieldType.indexOptions() != IndexOptions.DOCS)) { + if (fieldType.indexOptions() != IndexOptions.NONE && (includeDefaults || fieldType.indexOptions() != IndexOptions.DOCS)) { builder.field("index_options", indexOptionToString(fieldType.indexOptions())); } if (nullValue != null) { diff --git a/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java b/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java index be4645574d4c5..0992020e5b751 100644 --- a/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java +++ b/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java @@ -58,7 +58,7 @@ public class Murmur3FieldMapperTests extends FieldMapperTestCase unsupportedProperties() { - return Set.of("analyzer", "similarity", "doc_values"); + return Set.of("analyzer", "similarity", "doc_values", "index"); } @Before diff --git a/server/src/internalClusterTest/java/org/elasticsearch/indices/mapping/SimpleGetFieldMappingsIT.java b/server/src/internalClusterTest/java/org/elasticsearch/indices/mapping/SimpleGetFieldMappingsIT.java index c47d2e75c93e7..2f3b9dabcfe76 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/indices/mapping/SimpleGetFieldMappingsIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/indices/mapping/SimpleGetFieldMappingsIT.java @@ -127,9 +127,10 @@ public void testGetFieldMappings() throws Exception { public void testSimpleGetFieldMappingsWithDefaults() throws Exception { assertAcked(prepareCreate("test").setMapping(getMappingForType())); client().admin().indices().preparePutMapping("test").setSource("num", "type=long").get(); + client().admin().indices().preparePutMapping("test").setSource("field2", "type=text,index=false").get(); GetFieldMappingsResponse response = client().admin().indices().prepareGetFieldMappings() - .setFields("num", "field1", "obj.subfield").includeDefaults(true).get(); + .setFields("num", "field1", "field2", "obj.subfield").includeDefaults(true).get(); assertThat((Map) response.fieldMappings("test", "num").sourceAsMap().get("num"), hasEntry("index", Boolean.TRUE)); @@ -139,6 +140,8 @@ public void testSimpleGetFieldMappingsWithDefaults() throws Exception { hasEntry("index", Boolean.TRUE)); assertThat((Map) response.fieldMappings("test", "field1").sourceAsMap().get("field1"), hasEntry("type", "text")); + assertThat((Map) response.fieldMappings("test", "field2").sourceAsMap().get("field2"), + hasEntry("type", "text")); assertThat((Map) response.fieldMappings("test", "obj.subfield").sourceAsMap().get("subfield"), hasEntry("type", "keyword")); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java index 0de7f9ae4c64d..ab75f55283447 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java @@ -19,6 +19,7 @@ package org.elasticsearch.index.mapper; import org.apache.lucene.document.FieldType; +import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.IndexableField; import org.apache.lucene.index.Term; import org.apache.lucene.search.DocValuesFieldExistsQuery; @@ -61,6 +62,7 @@ public static class Defaults { public static final FieldType FIELD_TYPE = new FieldType(); static { FIELD_TYPE.setStored(false); + FIELD_TYPE.setIndexOptions(IndexOptions.DOCS); FIELD_TYPE.freeze(); } } 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 7888ba791a67d..f6d7b391c4c09 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java @@ -22,6 +22,7 @@ import org.apache.lucene.document.LatLonDocValuesField; import org.apache.lucene.document.LatLonPoint; import org.apache.lucene.document.StoredField; +import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.IndexableField; import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.common.Explicit; @@ -50,6 +51,7 @@ public class GeoPointFieldMapper extends AbstractPointGeometryFieldMapper conflicts) { protected void doXContentBody(XContentBuilder builder, boolean includeDefaults, Params params) throws IOException { super.doXContentBody(builder, includeDefaults, params); - if (includeDefaults || (mappedFieldType.isSearchable() && fieldType.indexOptions() != IndexOptions.DOCS)) { + if (fieldType.indexOptions() != IndexOptions.NONE + && (includeDefaults || fieldType.indexOptions() != Defaults.FIELD_TYPE.indexOptions())) { builder.field("index_options", indexOptionToString(fieldType.indexOptions())); } if (nullValue != null) { 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 51202fa65ec00..0350957fcdf70 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java @@ -80,6 +80,7 @@ public static class Defaults { public static final FieldType FIELD_TYPE = new FieldType(); static { FIELD_TYPE.setStored(false); + FIELD_TYPE.setIndexOptions(IndexOptions.DOCS); FIELD_TYPE.freeze(); } } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java index e371d675143a7..e019c6dd8367d 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/RangeFieldMapper.java @@ -20,6 +20,7 @@ package org.elasticsearch.index.mapper; import org.apache.lucene.document.FieldType; +import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.Term; import org.apache.lucene.search.BoostQuery; import org.apache.lucene.search.DocValuesFieldExistsQuery; @@ -75,6 +76,7 @@ public static class Defaults { public static final FieldType FIELD_TYPE = new FieldType(); static { FIELD_TYPE.setStored(false); + FIELD_TYPE.setIndexOptions(IndexOptions.DOCS); FIELD_TYPE.freeze(); } public static final DateFormatter DATE_FORMATTER = DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER; diff --git a/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java index 893530651d1af..96b908f2e728d 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java @@ -917,7 +917,8 @@ protected boolean docValuesByDefault() { @Override protected void doXContentBody(XContentBuilder builder, boolean includeDefaults, Params params) throws IOException { super.doXContentBody(builder, includeDefaults, params); - if (includeDefaults || (mappedFieldType.isSearchable() && fieldType.indexOptions() != Defaults.FIELD_TYPE.indexOptions())) { + if (fieldType.indexOptions() != IndexOptions.NONE + && (includeDefaults || fieldType.indexOptions() != Defaults.FIELD_TYPE.indexOptions())) { builder.field("index_options", indexOptionToString(fieldType.indexOptions())); } if (includeDefaults || fieldType.storeTermVectors() != Defaults.FIELD_TYPE.storeTermVectors()) { diff --git a/server/src/test/java/org/elasticsearch/index/mapper/BinaryFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/BinaryFieldMapperTests.java index 108b2cc719ff0..760ba9aabb5e6 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/BinaryFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/BinaryFieldMapperTests.java @@ -47,7 +47,7 @@ public class BinaryFieldMapperTests extends FieldMapperTestCase unsupportedProperties() { - return Set.of("analyzer", "eager_global_ordinals", "norms", "similarity"); + return Set.of("analyzer", "eager_global_ordinals", "norms", "similarity", "index"); } @Override diff --git a/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java index f2046a80d2067..66fec4eca1fc2 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java @@ -82,7 +82,7 @@ public void addModifiers() { @Override protected Set unsupportedProperties() { - return Set.of("doc_values"); + return Set.of("doc_values", "index"); } @Override diff --git a/test/framework/src/main/java/org/elasticsearch/index/mapper/FieldMapperTestCase.java b/test/framework/src/main/java/org/elasticsearch/index/mapper/FieldMapperTestCase.java index 0609e218b6a67..39d5c8fd51f49 100644 --- a/test/framework/src/main/java/org/elasticsearch/index/mapper/FieldMapperTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/index/mapper/FieldMapperTestCase.java @@ -42,6 +42,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; @@ -95,6 +96,7 @@ protected Set unsupportedProperties() { b.docValues(false); }), booleanModifier("eager_global_ordinals", true, (a, t) -> a.setEagerGlobalOrdinals(t)), + booleanModifier("index", false, (a, t) -> a.index(t)), booleanModifier("norms", false, FieldMapper.Builder::omitNorms), new Modifier("search_analyzer", true, (a, b) -> { a.searchAnalyzer(new NamedAnalyzer("standard", AnalyzerScope.INDEX, new StandardAnalyzer())); @@ -228,22 +230,27 @@ protected void assertSerializes(String indexname, T builder) throws IOException Mapper.BuilderContext context = new Mapper.BuilderContext(SETTINGS, new ContentPath(1)); - XContentBuilder x = JsonXContent.contentBuilder(); - x.startObject().startObject("properties"); - builder.build(context).toXContent(x, ToXContent.EMPTY_PARAMS); - x.endObject().endObject(); - String mappings = Strings.toString(x); + String mappings = mappingsToString(builder.build(context), false); + String mappingsWithDefault = mappingsToString(builder.build(context), true); mapperService.merge("_doc", new CompressedXContent(mappings), MapperService.MergeReason.MAPPING_UPDATE); Mapper rebuilt = mapperService.documentMapper().mappers().getMapper(builder.name); - x = JsonXContent.contentBuilder(); - x.startObject().startObject("properties"); - rebuilt.toXContent(x, ToXContent.EMPTY_PARAMS); - x.endObject().endObject(); - String reparsed = Strings.toString(x); + String reparsed = mappingsToString(rebuilt, false); + String reparsedWithDefault = mappingsToString(rebuilt, true); assertThat(reparsed, equalTo(mappings)); + assertThat(reparsedWithDefault, equalTo(mappingsWithDefault)); + } + + private String mappingsToString(ToXContent builder, boolean includeDefaults) throws IOException { + ToXContent.Params params = includeDefaults ? + new ToXContent.MapParams(Map.of("include_defaults", "true")) : ToXContent.EMPTY_PARAMS; + XContentBuilder x = JsonXContent.contentBuilder(); + x.startObject().startObject("properties"); + builder.toXContent(x, params); + x.endObject().endObject(); + return Strings.toString(x); } } diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapperTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapperTests.java index 2aa2bcd273f6a..d14cc87c79aff 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapperTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapperTests.java @@ -37,7 +37,7 @@ public class HistogramFieldMapperTests extends FieldMapperTestCase unsupportedProperties() { - return Set.of("analyzer", "similarity", "doc_values", "store"); + return Set.of("analyzer", "similarity", "doc_values", "store", "index"); } public void testParseValue() throws Exception { diff --git a/x-pack/plugin/mapper-constant-keyword/src/main/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapper.java b/x-pack/plugin/mapper-constant-keyword/src/main/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapper.java index d854d8405c46f..dd7bed0d5c3c4 100644 --- a/x-pack/plugin/mapper-constant-keyword/src/main/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapper.java +++ b/x-pack/plugin/mapper-constant-keyword/src/main/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapper.java @@ -70,6 +70,8 @@ public Builder(String name) { builder = this; } + // TODO we should ban setting 'index' on constant keyword + public Builder setValue(String value) { this.value = value; return this; diff --git a/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java b/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java index 490c98195b64f..c1e183d7c804c 100644 --- a/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java +++ b/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java @@ -36,7 +36,7 @@ protected Collection> getPlugins() { @Override protected Set unsupportedProperties() { - return Set.of("analyzer", "similarity", "store", "doc_values"); + return Set.of("analyzer", "similarity", "store", "doc_values", "index"); } @Override diff --git a/x-pack/plugin/mapper-flattened/src/main/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapper.java b/x-pack/plugin/mapper-flattened/src/main/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapper.java index 21425cdc39b60..577b7af85ff67 100644 --- a/x-pack/plugin/mapper-flattened/src/main/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapper.java +++ b/x-pack/plugin/mapper-flattened/src/main/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapper.java @@ -635,7 +635,8 @@ protected void parseCreateField(ParseContext context) throws IOException { @Override protected void doXContentBody(XContentBuilder builder, boolean includeDefaults, Params params) throws IOException { super.doXContentBody(builder, includeDefaults, params); - if (includeDefaults || mappedFieldType.isSearchable() && fieldType.indexOptions() != Defaults.FIELD_TYPE.indexOptions()) { + if (fieldType.indexOptions() != IndexOptions.NONE + && (includeDefaults || fieldType.indexOptions() != Defaults.FIELD_TYPE.indexOptions())) { builder.field("index_options", indexOptionToString(fieldType.indexOptions())); } if (includeDefaults || depthLimit != Defaults.DEPTH_LIMIT) { diff --git a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java index 69c370b7b96aa..5fe1689fefad2 100644 --- a/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java +++ b/x-pack/plugin/spatial/src/main/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapper.java @@ -9,6 +9,7 @@ import org.apache.lucene.document.FieldType; import org.apache.lucene.document.LatLonShape; import org.apache.lucene.document.ShapeField; +import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.IndexableField; import org.apache.lucene.util.BytesRef; import org.elasticsearch.Version; @@ -61,13 +62,17 @@ */ public class GeoShapeWithDocValuesFieldMapper extends GeoShapeFieldMapper { public static final String CONTENT_TYPE = "geo_shape"; + public static final FieldType FIELD_TYPE = new FieldType(); + static { + FIELD_TYPE.setIndexOptions(IndexOptions.DOCS); + } public static class Builder extends AbstractShapeGeometryFieldMapper.Builder { private boolean docValuesSet = false; public Builder(String name) { - super (name, new FieldType()); + super (name, FIELD_TYPE); this.hasDocValues = true; } diff --git a/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapperTests.java b/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapperTests.java index 8804c8292bb4c..7516ca90b1e5b 100644 --- a/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapperTests.java +++ b/x-pack/plugin/vectors/src/test/java/org/elasticsearch/xpack/vectors/mapper/DenseVectorFieldMapperTests.java @@ -52,7 +52,7 @@ protected Collection> getPlugins() { @Override protected Set unsupportedProperties() { - return Set.of("analyzer", "similarity", "doc_values", "store"); + return Set.of("analyzer", "similarity", "doc_values", "store", "index"); } @Before