Skip to content

Commit 2b3afe8

Browse files
martijnvgfzowl
authored andcommitted
Use the default serializer check for normalizer_skip_store_original_value mapping attribute (elastic#137085)
With the current serializer check the `normalizer_skip_store_original_value` mapping attribute always gets serialized if there is a normalizer configured, this makes serialized form of mapping larger than it needs to be. On top of it assertions may fail when restoring older indices that have fields with normalizer.
1 parent 616bc52 commit 2b3afe8

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ private Builder(
287287
m -> ((KeywordFieldMapper) m).isNormalizerSkipStoreOriginalValue(),
288288
() -> "lowercase".equals(normalizer.getValue())
289289
&& indexAnalyzers.getNormalizer(normalizer.getValue()).analyzer() instanceof LowercaseNormalizer
290-
).setSerializerCheck((includeDefaults, isConfigured, value) -> includeDefaults || isConfigured || value);
290+
);
291291

292292
this.script.precludesParameters(nullValue);
293293
addScriptValidation(script, indexed, hasDocValues);

server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,15 @@ public void testNormalizerSyntheticSourceKeepOriginalValue() throws IOException
582582
b -> b.field("type", "keyword").field("normalizer", "lowercase").field("normalizer_skip_store_original_value", false)
583583
)
584584
);
585+
var keywordMapper = mapper.mappingLookup().getMapper("field");
586+
assertThat(keywordMapper, Matchers.instanceOf(KeywordFieldMapper.class));
587+
assertFalse(((KeywordFieldMapper) keywordMapper).isNormalizerSkipStoreOriginalValue());
588+
585589
assertEquals("{\"field\":\"AbC\"}", syntheticSource(mapper.documentMapper(), b -> b.field("field", "AbC")));
590+
591+
String expected = """
592+
{"field":{"type":"keyword","normalizer":"lowercase","normalizer_skip_store_original_value":false}}""";
593+
assertThat(keywordMapper.toString(), equalTo(expected));
586594
}
587595

588596
public void testNormalizerSyntheticSourceSkipStoreOriginalValue() throws IOException {
@@ -591,7 +599,17 @@ public void testNormalizerSyntheticSourceSkipStoreOriginalValue() throws IOExcep
591599
b -> b.field("type", "keyword").field("normalizer", "lowercase").field("normalizer_skip_store_original_value", true)
592600
)
593601
);
602+
var keywordMapper = mapper.mappingLookup().getMapper("field");
603+
assertThat(keywordMapper, Matchers.instanceOf(KeywordFieldMapper.class));
604+
assertTrue(((KeywordFieldMapper) keywordMapper).isNormalizerSkipStoreOriginalValue());
605+
594606
assertEquals("{\"field\":\"abc\"}", syntheticSource(mapper.documentMapper(), b -> b.field("field", "AbC")));
607+
608+
// normalizer_skip_store_original_value is configured, but it is the same as the default value, and therefor it isn't serialized
609+
// (See default serializerCheck in Parameter.java)
610+
String expected = """
611+
{"field":{"type":"keyword","normalizer":"lowercase"}}""";
612+
assertThat(keywordMapper.toString(), equalTo(expected));
595613
}
596614

597615
public void testSkipStoreOriginalValueForLowercaseNormalizer() throws IOException {
@@ -604,6 +622,9 @@ public void testSkipStoreOriginalValueForLowercaseNormalizer() throws IOExceptio
604622
assertTrue(((KeywordFieldMapper) keywordMapper).isNormalizerSkipStoreOriginalValue());
605623

606624
assertEquals("{\"field\":\"abc\"}", syntheticSource(mapper.documentMapper(), b -> b.field("field", "AbC")));
625+
String expected = """
626+
{"field":{"type":"keyword","normalizer":"lowercase"}}""";
627+
assertThat(keywordMapper.toString(), equalTo(expected));
607628
}
608629

609630
public void testSkipStoreOriginalValueForCustomNormalizer() throws IOException {
@@ -616,6 +637,26 @@ public void testSkipStoreOriginalValueForCustomNormalizer() throws IOException {
616637
assertFalse(((KeywordFieldMapper) keywordMapper).isNormalizerSkipStoreOriginalValue());
617638

618639
assertEquals("{\"field\":\"AbC\"}", syntheticSource(mapper.documentMapper(), b -> b.field("field", "AbC")));
640+
String expected = """
641+
{"field":{"type":"keyword","normalizer":"other_lowercase"}}""";
642+
assertThat(keywordMapper.toString(), equalTo(expected));
643+
}
644+
645+
public void testSkipStoreOriginalValueForCustomNormalizerOverwriteSkipStoreOriginalValue() throws IOException {
646+
MapperService mapper = createSytheticSourceMapperService(
647+
fieldMapping(
648+
b -> b.field("type", "keyword").field("normalizer", "other_lowercase").field("normalizer_skip_store_original_value", true)
649+
)
650+
);
651+
652+
var keywordMapper = mapper.mappingLookup().getMapper("field");
653+
assertThat(keywordMapper, Matchers.instanceOf(KeywordFieldMapper.class));
654+
assertTrue(((KeywordFieldMapper) keywordMapper).isNormalizerSkipStoreOriginalValue());
655+
656+
assertEquals("{\"field\":\"abc\"}", syntheticSource(mapper.documentMapper(), b -> b.field("field", "AbC")));
657+
String expected = """
658+
{"field":{"type":"keyword","normalizer":"other_lowercase","normalizer_skip_store_original_value":true}}""";
659+
assertThat(keywordMapper.toString(), equalTo(expected));
619660
}
620661

621662
public void testParsesKeywordNestedEmptyObjectStrict() throws IOException {

0 commit comments

Comments
 (0)