From a70d4eeeea579055c79ec718aad68312d4754fc4 Mon Sep 17 00:00:00 2001 From: Oleksandr Kolomiiets Date: Wed, 5 Feb 2025 08:21:59 -0800 Subject: [PATCH] Fix synthetic source issue with deeply nested ignored source fields (#121715) * Fix synthetic source issue with deeply nested ignored source fields * Update docs/changelog/121715.yaml --- docs/changelog/121715.yaml | 5 ++++ .../index/mapper/ObjectMapper.java | 2 +- .../mapper/IgnoredSourceFieldMapperTests.java | 28 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 docs/changelog/121715.yaml diff --git a/docs/changelog/121715.yaml b/docs/changelog/121715.yaml new file mode 100644 index 0000000000000..837bae57b4c91 --- /dev/null +++ b/docs/changelog/121715.yaml @@ -0,0 +1,5 @@ +pr: 121715 +summary: Fix synthetic source issue with deeply nested ignored source fields +area: Mapping +type: bug +issues: [] diff --git a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java index 0a9028c480c1d..9656cb25e9f6c 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java @@ -1130,7 +1130,7 @@ public boolean setIgnoredValues(Map { + b.startObject("top"); + b.startObject("properties"); + { + b.startObject("level1").startObject("properties"); + { + b.startObject("level2").startObject("properties"); + { + b.startObject("n") + .field("type", "integer") + .field("doc_values", "false") + .field("synthetic_source_keep", "all") + .endObject(); + } + b.endObject().endObject(); + } + b.endObject().endObject(); + } + b.endObject().endObject(); + })).documentMapper(); + + var syntheticSource = syntheticSource(documentMapper, b -> { + b.startObject("top").startObject("level1").startObject("level2").field("n", 25).endObject().endObject().endObject(); + }); + assertEquals("{\"top\":{\"level1\":{\"level2\":{\"n\":25}}}}", syntheticSource); + } + protected void validateRoundTripReader(String syntheticSource, DirectoryReader reader, DirectoryReader roundTripReader) throws IOException { // We exclude ignored source field since in some cases it contains an exact copy of a part of document source.