From 11ca54880e8e2a2c671e275c57529903a6b5fbde Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Thu, 12 Jun 2025 07:47:01 +0200 Subject: [PATCH] Fix broken bwc logic in text field mapper introduced by #129126 A missing condition in the bwc logic caused a text field to be a stored, while before #129126, this wasn't the case. --- .../index/mapper/TextFieldMapper.java | 2 +- .../index/mapper/TextFieldMapperTests.java | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) 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 0e49506cd92e7..ea4fd45ab3df4 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java @@ -316,7 +316,7 @@ public Builder( && this.withinMultiField == false && multiFieldsBuilder.hasSyntheticSourceCompatibleKeywordField() == false; } else { - return isSyntheticSourceEnabled; + return isSyntheticSourceEnabled && multiFieldsBuilder.hasSyntheticSourceCompatibleKeywordField() == false; } }); this.indexCreatedVersion = indexCreatedVersion; diff --git a/server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java index fa2fce306ff8a..2c8dc48cf0484 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java @@ -51,6 +51,7 @@ import org.elasticsearch.index.IndexMode; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.IndexVersion; +import org.elasticsearch.index.IndexVersions; import org.elasticsearch.index.analysis.AnalyzerScope; import org.elasticsearch.index.analysis.CharFilterFactory; import org.elasticsearch.index.analysis.CustomAnalyzer; @@ -350,6 +351,31 @@ public void testStoreParameterDefaultsSyntheticSourceWithKeywordMultiField() thr assertThat(fieldType.stored(), is(false)); } + public void testStoreParameterDefaultsSyntheticSourceWithKeywordMultiFieldBwc() throws IOException { + var indexSettingsBuilder = getIndexSettingsBuilder(); + indexSettingsBuilder.put(IndexSettings.INDEX_MAPPER_SOURCE_MODE_SETTING.getKey(), "synthetic"); + var indexSettings = indexSettingsBuilder.build(); + + var mapping = mapping(b -> { + b.startObject("name"); + b.field("type", "text"); + b.startObject("fields"); + b.startObject("keyword"); + b.field("type", "keyword"); + b.endObject(); + b.endObject(); + b.endObject(); + }); + IndexVersion beforeVersion = IndexVersions.INDEX_INT_SORT_INT_TYPE; + DocumentMapper mapper = createMapperService(beforeVersion, indexSettings, mapping).documentMapper(); + + var source = source(b -> b.field("name", "quick brown fox")); + ParsedDocument doc = mapper.parse(source); + List fields = doc.rootDoc().getFields("name"); + IndexableFieldType fieldType = fields.get(0).fieldType(); + assertThat(fieldType.stored(), is(false)); + } + public void testStoreParameterDefaultsSyntheticSourceTextFieldIsMultiField() throws IOException { var indexSettingsBuilder = getIndexSettingsBuilder(); indexSettingsBuilder.put(IndexSettings.INDEX_MAPPER_SOURCE_MODE_SETTING.getKey(), "synthetic"); @@ -374,6 +400,31 @@ public void testStoreParameterDefaultsSyntheticSourceTextFieldIsMultiField() thr assertThat(fieldType.stored(), is(false)); } + public void testStoreParameterDefaultsSyntheticSourceTextFieldIsMultiFieldBwc() throws IOException { + var indexSettingsBuilder = getIndexSettingsBuilder(); + indexSettingsBuilder.put(IndexSettings.INDEX_MAPPER_SOURCE_MODE_SETTING.getKey(), "synthetic"); + var indexSettings = indexSettingsBuilder.build(); + + var mapping = mapping(b -> { + b.startObject("name"); + b.field("type", "keyword"); + b.startObject("fields"); + b.startObject("text"); + b.field("type", "text"); + b.endObject(); + b.endObject(); + b.endObject(); + }); + IndexVersion beforeVersion = IndexVersions.INDEX_INT_SORT_INT_TYPE; + DocumentMapper mapper = createMapperService(beforeVersion, indexSettings, mapping).documentMapper(); + + var source = source(b -> b.field("name", "quick brown fox")); + ParsedDocument doc = mapper.parse(source); + List fields = doc.rootDoc().getFields("name.text"); + IndexableFieldType fieldType = fields.get(0).fieldType(); + assertThat(fieldType.stored(), is(true)); + } + public void testBWCSerialization() throws IOException { MapperService mapperService = createMapperService(fieldMapping(b -> { b.field("type", "text");