diff --git a/docs/changelog/112850.yaml b/docs/changelog/112850.yaml new file mode 100644 index 0000000000000..97a8877f6291c --- /dev/null +++ b/docs/changelog/112850.yaml @@ -0,0 +1,5 @@ +pr: 112850 +summary: Fix synthetic source field names for multi-fields +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 a616fe9c20c26..6bcad389c34b7 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 @@ -433,7 +433,7 @@ public MatchOnlyTextFieldType fieldType() { @Override protected SyntheticSourceSupport syntheticSourceSupport() { - var loader = new StringStoredFieldFieldLoader(fieldType().storedFieldNameForSyntheticSource(), leafName()) { + var loader = new StringStoredFieldFieldLoader(fieldType().storedFieldNameForSyntheticSource(), fieldType().name(), leafName()) { @Override protected void write(XContentBuilder b, Object value) throws IOException { b.value((String) value); 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 b66ce41d3259d..c046fb3fcc4f0 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 @@ -582,7 +582,7 @@ protected void write(XContentBuilder b, Object value) throws IOException { var kwd = TextFieldMapper.SyntheticSourceHelper.getKeywordFieldMapperForSyntheticSource(this); if (kwd != null) { - return new SyntheticSourceSupport.Native(kwd.syntheticFieldLoader(leafName())); + return new SyntheticSourceSupport.Native(kwd.syntheticFieldLoader(fullPath(), leafName())); } return super.syntheticSourceSupport(); 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 97c48c7bbfa36..6b563e93b073a 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java @@ -1037,13 +1037,13 @@ protected SyntheticSourceSupport syntheticSourceSupport() { } if (fieldType.stored() || hasDocValues) { - return new SyntheticSourceSupport.Native(syntheticFieldLoader(leafName())); + return new SyntheticSourceSupport.Native(syntheticFieldLoader(fullPath(), leafName())); } return super.syntheticSourceSupport(); } - public SourceLoader.SyntheticFieldLoader syntheticFieldLoader(String simpleName) { + public SourceLoader.SyntheticFieldLoader syntheticFieldLoader(String fullFieldName, String leafFieldName) { assert fieldType.stored() || hasDocValues; var layers = new ArrayList(); @@ -1081,6 +1081,6 @@ protected void writeValue(Object value, XContentBuilder b) throws IOException { }); } - return new CompositeSyntheticFieldLoader(simpleName, fullPath(), layers); + return new CompositeSyntheticFieldLoader(leafFieldName, fullFieldName, layers); } } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoader.java index a539bda6eaa41..44990c094295d 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/StringStoredFieldFieldLoader.java @@ -19,19 +19,25 @@ import static java.util.Collections.emptyList; public abstract class StringStoredFieldFieldLoader implements SourceLoader.SyntheticFieldLoader { - private final String name; + private final String storedFieldLoaderName; + private final String fullName; private final String simpleName; private List values = emptyList(); - public StringStoredFieldFieldLoader(String name, String simpleName) { - this.name = name; + public StringStoredFieldFieldLoader(String fullName, String simpleName) { + this(fullName, fullName, simpleName); + } + + public StringStoredFieldFieldLoader(String storedFieldLoaderName, String fullName, String simpleName) { + this.storedFieldLoaderName = storedFieldLoaderName; + this.fullName = fullName; this.simpleName = simpleName; } @Override public final Stream> storedFieldLoaders() { - return Stream.of(Map.entry(name, newValues -> values = newValues)); + return Stream.of(Map.entry(storedFieldLoaderName, newValues -> values = newValues)); } @Override @@ -72,6 +78,6 @@ public final DocValuesLoader docValuesLoader(LeafReader reader, int[] docIdsInLe @Override public String fieldName() { - return name; + return fullName; } } 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 8c8396c7a9bb7..972e9e415ce94 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java @@ -1462,7 +1462,7 @@ protected void write(XContentBuilder b, Object value) throws IOException { var kwd = SyntheticSourceHelper.getKeywordFieldMapperForSyntheticSource(this); if (kwd != null) { - return new SyntheticSourceSupport.Native(kwd.syntheticFieldLoader(leafName())); + return new SyntheticSourceSupport.Native(kwd.syntheticFieldLoader(fullPath(), leafName())); } return super.syntheticSourceSupport();