diff --git a/docs/reference/mapping/types/flattened.asciidoc b/docs/reference/mapping/types/flattened.asciidoc index 7181d53c2ce09..c50d5fe24513e 100644 --- a/docs/reference/mapping/types/flattened.asciidoc +++ b/docs/reference/mapping/types/flattened.asciidoc @@ -140,7 +140,8 @@ The following mapping parameters are accepted: The maximum allowed depth of the flattened object field, in terms of nested inner objects. If a flattened object field exceeds this limit, then an - error will be thrown. Defaults to `20`. + error will be thrown. Defaults to `20`. Note that `depth_limit` can be + updated dynamically through the <> API. <>:: diff --git a/x-pack/plugin/mapper-flattened/src/main/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapper.java b/x-pack/plugin/mapper-flattened/src/main/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapper.java index eef76f0807bfb..5928d9889c8c8 100644 --- a/x-pack/plugin/mapper-flattened/src/main/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapper.java +++ b/x-pack/plugin/mapper-flattened/src/main/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapper.java @@ -525,7 +525,7 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) { } } - private final FlatObjectFieldParser fieldParser; + private FlatObjectFieldParser fieldParser; private int depthLimit; private int ignoreAbove; @@ -552,7 +552,12 @@ protected String contentType() { @Override protected void doMerge(Mapper mergeWith) { super.doMerge(mergeWith); - this.ignoreAbove = ((FlatObjectFieldMapper) mergeWith).ignoreAbove; + + FlatObjectFieldMapper other = ((FlatObjectFieldMapper) mergeWith); + this.depthLimit = other.depthLimit; + this.ignoreAbove = other.ignoreAbove; + this.fieldParser = new FlatObjectFieldParser(fieldType.name(), keyedFieldName(), + fieldType, depthLimit, ignoreAbove); } @Override diff --git a/x-pack/plugin/mapper-flattened/src/test/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapperTests.java b/x-pack/plugin/mapper-flattened/src/test/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapperTests.java index d68c246f19d28..aeb22c331b355 100644 --- a/x-pack/plugin/mapper-flattened/src/test/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapperTests.java +++ b/x-pack/plugin/mapper-flattened/src/test/java/org/elasticsearch/xpack/flattened/mapper/FlatObjectFieldMapperTests.java @@ -316,12 +316,12 @@ public void testFieldMultiplicity() throws Exception { } public void testDepthLimit() throws IOException { - String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject() + // First verify the default behavior when depth_limit is not set. + String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject() .startObject("type") .startObject("properties") .startObject("field") .field("type", "flattened") - .field("depth_limit", 2) .endObject() .endObject() .endObject() @@ -340,8 +340,25 @@ public void testDepthLimit() throws IOException { .endObject() .endObject()); + mapper.parse(new SourceToParse("test", "1", doc, XContentType.JSON)); + + // Set a lower value for depth_limit and check that the field is rejected. + String newMapping = Strings.toString(XContentFactory.jsonBuilder().startObject() + .startObject("type") + .startObject("properties") + .startObject("field") + .field("type", "flattened") + .field("depth_limit", 2) + .endObject() + .endObject() + .endObject() + .endObject()); + + DocumentMapper newMapper = mapper.merge( + parser.parse("type", new CompressedXContent(newMapping)).mapping()); + expectThrows(MapperParsingException.class, () -> - mapper.parse(new SourceToParse("test", "1", doc, XContentType.JSON))); + newMapper.parse(new SourceToParse("test", "1", doc, XContentType.JSON))); } public void testEagerGlobalOrdinals() throws IOException { @@ -362,12 +379,12 @@ public void testEagerGlobalOrdinals() throws IOException { } public void testIgnoreAbove() throws IOException { - String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject() + // First verify the default behavior when ignore_above is not set. + String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject() .startObject("type") .startObject("properties") .startObject("field") .field("type", "flattened") - .field("ignore_above", 10) .endObject() .endObject() .endObject() @@ -386,7 +403,26 @@ public void testIgnoreAbove() throws IOException { ParsedDocument parsedDoc = mapper.parse(new SourceToParse("test", "1", doc, XContentType.JSON)); IndexableField[] fields = parsedDoc.rootDoc().getFields("field"); - assertEquals(0, fields.length); + assertEquals(2, fields.length); + + // Set a lower value for ignore_above and check that the field is skipped. + String newMapping = Strings.toString(XContentFactory.jsonBuilder().startObject() + .startObject("type") + .startObject("properties") + .startObject("field") + .field("type", "flattened") + .field("ignore_above", "10") + .endObject() + .endObject() + .endObject() + .endObject()); + + DocumentMapper newMapper = mapper.merge( + parser.parse("type", new CompressedXContent(newMapping)).mapping()); + + ParsedDocument newParsedDoc = newMapper.parse(new SourceToParse("test", "1", doc, XContentType.JSON)); + IndexableField[] newFields = newParsedDoc.rootDoc().getFields("field"); + assertEquals(0, newFields.length); } public void testNullValues() throws Exception {