From cf269d8391f1e335a7263edcee46e8796a34608c Mon Sep 17 00:00:00 2001 From: Jordan Powers Date: Thu, 9 Oct 2025 13:26:56 -0700 Subject: [PATCH] Store full path in _ignored when ignoring dynamic array field (#136315) Currently, when a dynamic array field trips `index.mapping.total_fields. limit` and is ignored due to `index.mapping.total_fields. ignore_dynamic_beyond_limit`, the leaf name is stored in _ignored. This is inconsistent with single-valued fields where the full path is stored in _ignored. This PR updates the logic so that in both cases, the full path is stored. --- docs/changelog/136315.yaml | 5 +++++ .../org/elasticsearch/index/mapper/DynamicMappingIT.java | 8 ++++++++ .../org/elasticsearch/index/mapper/DocumentParser.java | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 docs/changelog/136315.yaml diff --git a/docs/changelog/136315.yaml b/docs/changelog/136315.yaml new file mode 100644 index 0000000000000..7e82f83e0e07c --- /dev/null +++ b/docs/changelog/136315.yaml @@ -0,0 +1,5 @@ +pr: 136315 +summary: Store full path in `_ignored` when ignoring dynamic array field +area: Mapping +type: bug +issues: [] diff --git a/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java b/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java index 06561bc6d4c97..05656ede61a15 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/index/mapper/DynamicMappingIT.java @@ -382,6 +382,14 @@ public void testIgnoreDynamicBeyondLimitObjectMultiField() { }); } + public void testIgnoreDynamicBeyondLimitObjectArrayField() { + indexIgnoreDynamicBeyond(2, orderedMap("a", orderedMap("b", 1, "c", List.of(2, 3, 4))), fields -> { + assertThat(fields.keySet(), equalTo(Set.of("a.b", "_ignored"))); + assertThat(fields.get("a.b").getValues(), Matchers.contains(1L)); + assertThat(fields.get("_ignored").getValues(), Matchers.contains("a.c")); + }); + } + public void testIgnoreDynamicBeyondLimitRuntimeFields() { indexIgnoreDynamicBeyond(1, orderedMap("field1", 1, "field2", List.of(1, 2)), Map.of("dynamic", "runtime"), fields -> { assertThat(fields.keySet(), equalTo(Set.of("field1", "_ignored"))); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java index c12a350057694..196a0b2c98627 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java @@ -659,7 +659,7 @@ private static void parseArrayDynamic(DocumentParserContext context, String curr throw new IllegalArgumentException("failed to parse field [" + currentFieldName + " ]", e); } } - context.addIgnoredField(currentFieldName); + context.addIgnoredField(context.path().pathAsText(currentFieldName)); return; } parseNonDynamicArray(context, objectMapperFromTemplate, currentFieldName, currentFieldName);