diff --git a/docs/changelog/137297.yaml b/docs/changelog/137297.yaml new file mode 100644 index 0000000000000..78bf261de616f --- /dev/null +++ b/docs/changelog/137297.yaml @@ -0,0 +1,5 @@ +pr: 137297 +summary: Fixed inconsistency in the `isSyntheticSourceEnabled` flag +area: Mapping +type: bug +issues: [] diff --git a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapper.java b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapper.java index 628e84173496f..59c2082c4fce8 100644 --- a/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapper.java +++ b/modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapper.java @@ -100,7 +100,7 @@ public static class Defaults { } - public static class Builder extends BuilderWithSyntheticSourceContext { + public static class Builder extends TextFamilyBuilder { private final Parameter> meta = Parameter.metaParam(); @@ -112,10 +112,9 @@ public Builder( IndexVersion indexCreatedVersion, IndexAnalyzers indexAnalyzers, boolean storedFieldInBinaryFormat, - boolean isSyntheticSourceEnabled, boolean isWithinMultiField ) { - super(name, indexCreatedVersion, isSyntheticSourceEnabled, isWithinMultiField); + super(name, indexCreatedVersion, isWithinMultiField); this.analyzers = new TextParams.Analyzers( indexAnalyzers, m -> ((MatchOnlyTextFieldMapper) m).indexAnalyzer, @@ -169,7 +168,6 @@ private static boolean isSyntheticSourceStoredFieldInBinaryFormat(IndexVersion i n, c.indexVersionCreated(), c.getIndexAnalyzers(), - isSyntheticSourceStoredFieldInBinaryFormat(c.indexVersionCreated()), SourceFieldMapper.isSynthetic(c.getIndexSettings()), c.isWithinMultiField() ) @@ -677,14 +675,8 @@ public Map indexAnalyzers() { @Override public FieldMapper.Builder getMergeBuilder() { - return new Builder( - leafName(), - indexCreatedVersion, - indexAnalyzers, - storedFieldInBinaryFormat, - fieldType().isSyntheticSourceEnabled(), - fieldType().isWithinMultiField() - ).init(this); + return new Builder(leafName(), indexCreatedVersion, indexAnalyzers, storedFieldInBinaryFormat, fieldType().isWithinMultiField()) + .init(this); } @Override diff --git a/plugins/mapper-annotated-text/src/main/java/org/elasticsearch/index/mapper/annotatedtext/AnnotatedTextFieldMapper.java b/plugins/mapper-annotated-text/src/main/java/org/elasticsearch/index/mapper/annotatedtext/AnnotatedTextFieldMapper.java index ea07ca64d6e70..b0ca13c947d3d 100644 --- a/plugins/mapper-annotated-text/src/main/java/org/elasticsearch/index/mapper/annotatedtext/AnnotatedTextFieldMapper.java +++ b/plugins/mapper-annotated-text/src/main/java/org/elasticsearch/index/mapper/annotatedtext/AnnotatedTextFieldMapper.java @@ -81,7 +81,7 @@ private static NamedAnalyzer wrapAnalyzer(NamedAnalyzer in) { ); } - public static class Builder extends BuilderWithSyntheticSourceContext { + public static class Builder extends TextFamilyBuilder { final Parameter similarity = TextParams.similarity(m -> builder(m).similarity.getValue()); final Parameter indexOptions = TextParams.textIndexOptions(m -> builder(m).indexOptions.getValue()); @@ -100,7 +100,7 @@ public Builder( boolean isSyntheticSourceEnabled, boolean isWithinMultiField ) { - super(name, indexCreatedVersion, isSyntheticSourceEnabled, isWithinMultiField); + super(name, indexCreatedVersion, isWithinMultiField); this.analyzers = new TextParams.Analyzers( indexAnalyzers, m -> builder(m).analyzers.getIndexAnalyzer(), @@ -111,7 +111,7 @@ public Builder( if (TextFieldMapper.keywordMultiFieldsNotStoredWhenIgnoredIndexVersionCheck(indexCreatedVersion())) { return false; } - return isSyntheticSourceEnabled() && multiFieldsBuilder.hasSyntheticSourceCompatibleKeywordField() == false; + return isSyntheticSourceEnabled && multiFieldsBuilder.hasSyntheticSourceCompatibleKeywordField() == false; }); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java index 30306ec16fffd..6317acaa65bd0 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/FieldMapper.java @@ -1663,21 +1663,14 @@ protected boolean inheritDimensionParameterFromParentObject(MapperBuilderContext /** * Creates mappers for fields that require additional context for supporting synthetic source. */ - public abstract static class BuilderWithSyntheticSourceContext extends Builder { + public abstract static class TextFamilyBuilder extends Builder { private final IndexVersion indexCreatedVersion; - private final boolean isSyntheticSourceEnabled; private final boolean isWithinMultiField; - protected BuilderWithSyntheticSourceContext( - String name, - IndexVersion indexCreatedVersion, - boolean isSyntheticSourceEnabled, - boolean isWithinMultiField - ) { + protected TextFamilyBuilder(String name, IndexVersion indexCreatedVersion, boolean isWithinMultiField) { super(name); this.indexCreatedVersion = indexCreatedVersion; - this.isSyntheticSourceEnabled = isSyntheticSourceEnabled; this.isWithinMultiField = isWithinMultiField; } @@ -1685,10 +1678,6 @@ public IndexVersion indexCreatedVersion() { return indexCreatedVersion; } - public boolean isSyntheticSourceEnabled() { - return isSyntheticSourceEnabled; - } - public boolean isWithinMultiField() { return isWithinMultiField; } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java index e8bbfbf5379be..d131bcb17817f 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/SourceFieldMapper.java @@ -557,6 +557,10 @@ public boolean isSynthetic() { return mode == Mode.SYNTHETIC; } + /** + * Caution: this function is not aware of the legacy "mappings._source.mode" parameter that some legacy indices might use. You should + * prefer to get information about synthetic source from {@link MapperBuilderContext}. + */ public static boolean isSynthetic(IndexSettings indexSettings) { return IndexSettings.INDEX_MAPPER_SOURCE_MODE_SETTING.get(indexSettings.getSettings()) == SourceFieldMapper.Mode.SYNTHETIC; } 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 6c5231fdfb9a1..a94825392cc79 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java @@ -238,7 +238,7 @@ private static FielddataFrequencyFilter parseFrequencyFilter(String name, Mappin return new FielddataFrequencyFilter(minFrequency, maxFrequency, minSegmentSize); } - public static class Builder extends BuilderWithSyntheticSourceContext { + public static class Builder extends TextFamilyBuilder { private final Parameter store; private final Parameter norms; @@ -301,7 +301,7 @@ public Builder( boolean isSyntheticSourceEnabled, boolean isWithinMultiField ) { - super(name, indexCreatedVersion, isSyntheticSourceEnabled, isWithinMultiField); + super(name, indexCreatedVersion, isWithinMultiField); this.indexMode = indexMode; this.analyzers = new TextParams.Analyzers( @@ -409,7 +409,7 @@ private TextFieldType buildFieldType( index.getValue(), store.getValue(), tsi, - isSyntheticSourceEnabled(), + context.isSourceSynthetic(), isWithinMultiField(), SyntheticSourceHelper.syntheticSourceDelegate(fieldType.stored(), multiFields), meta.getValue(), diff --git a/x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapper.java b/x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapper.java index 30eeb073e382f..32421ddba97f2 100644 --- a/x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapper.java +++ b/x-pack/plugin/logsdb/src/main/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapper.java @@ -29,7 +29,6 @@ import org.elasticsearch.index.mapper.MapperBuilderContext; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MappingParserContext; -import org.elasticsearch.index.mapper.SourceFieldMapper; import org.elasticsearch.index.mapper.SourceLoader; import org.elasticsearch.index.mapper.StringStoredFieldFieldLoader; import org.elasticsearch.index.mapper.TextParams; @@ -88,7 +87,7 @@ public static class Defaults { } } - public static class Builder extends BuilderWithSyntheticSourceContext { + public static class Builder extends TextFamilyBuilder { private final IndexSettings indexSettings; private final Parameter> meta = Parameter.metaParam(); @@ -97,23 +96,11 @@ public static class Builder extends BuilderWithSyntheticSourceContext { private final Parameter disableTemplating; public Builder(String name, MappingParserContext context) { - this( - name, - context.indexVersionCreated(), - context.getIndexSettings(), - SourceFieldMapper.isSynthetic(context.getIndexSettings()), - context.isWithinMultiField() - ); + this(name, context.indexVersionCreated(), context.getIndexSettings(), context.isWithinMultiField()); } - public Builder( - String name, - IndexVersion indexCreatedVersion, - IndexSettings indexSettings, - boolean isSyntheticSourceEnabled, - boolean isWithinMultiField - ) { - super(name, indexCreatedVersion, isSyntheticSourceEnabled, isWithinMultiField); + public Builder(String name, IndexVersion indexCreatedVersion, IndexSettings indexSettings, boolean isWithinMultiField) { + super(name, indexCreatedVersion, isWithinMultiField); this.indexSettings = indexSettings; this.analyzer = analyzerParam(name, m -> ((PatternTextFieldMapper) m).analyzer); this.disableTemplating = disableTemplatingParameter(indexSettings); @@ -249,13 +236,7 @@ public Map indexAnalyzers() { @Override public FieldMapper.Builder getMergeBuilder() { - return new Builder( - leafName(), - indexCreatedVersion, - indexSettings, - fieldType().isSyntheticSourceEnabled(), - fieldType().isWithinMultiField() - ).init(this); + return new Builder(leafName(), indexCreatedVersion, indexSettings, fieldType().isWithinMultiField()).init(this); } @Override