diff --git a/docs/changelog/129580.yaml b/docs/changelog/129580.yaml new file mode 100644 index 000000000000..9af61d55208c --- /dev/null +++ b/docs/changelog/129580.yaml @@ -0,0 +1,6 @@ +pr: 129580 +summary: Check prefixes when constructing synthetic source for flattened fields +area: Mapping +type: bug +issues: + - 129508 diff --git a/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldSyntheticWriterHelper.java b/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldSyntheticWriterHelper.java index 53f68fb6edee..7929858a8e94 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldSyntheticWriterHelper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldSyntheticWriterHelper.java @@ -261,7 +261,7 @@ public class FlattenedFieldSyntheticWriterHelper { final List values ) throws IOException { startObject(b, startPrefix.prefix); - if (currKeyValue.suffix.equals(nextKeyValue.suffix) == false) { + if (currKeyValue.prefix.equals(nextKeyValue.prefix) == false || currKeyValue.suffix.equals(nextKeyValue.suffix) == false) { writeNestedObject(b, values, currKeyValue.suffix().suffix); } endObject(b, endPrefix.prefix); 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 82dc0683fa98..77a463e78129 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 @@ -851,6 +851,23 @@ public class FlattenedFieldMapperTests extends MapperTestCase { assertThat(syntheticSource, equalTo("{\"field\":{\"key1\":\"val1\",\"obj1\":{\"key2\":\"val2\",\"key3\":[\"val3\",\"val4\"]}}}")); } + public void testSyntheticSourceWithCommonLeafField() throws IOException { + DocumentMapper mapper = createSytheticSourceMapperService( + mapping(b -> { b.startObject("field").field("type", "flattened").endObject(); }) + ).documentMapper(); + + var syntheticSource = syntheticSource(mapper, b -> { + b.startObject("field"); + { + b.startObject("obj1").field("key", "foo").endObject(); + b.startObject("obj2").field("key", "bar").endObject(); + } + b.endObject(); + }); + assertThat(syntheticSource, equalTo(""" + {"field":{"obj1":{"key":"foo"},"obj2":{"key":"bar"}}}""")); + } + @Override protected boolean supportsCopyTo() { return false;