Ver Fonte

Don't use 'default' as the default name for keyword normalizers (#68354)

We previously used 'null' as a placeholder for unconfigured normalizers
on keywords. With recent refactoring, this was changed to 'default', but
this causes problems for configurations that already have a custom
normalizer called 'default', which now gets ignored. This commit changes
the mapper back to using 'null' as a default, and adds a test that you can
add a normalizer called 'default' that will be applied correctly.
Alan Woodward há 4 anos atrás
pai
commit
246cd03096

+ 2 - 3
server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java

@@ -42,7 +42,6 @@ import java.io.UncheckedIOException;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.function.Supplier;
 
 /**
@@ -95,7 +94,7 @@ public final class KeywordFieldMapper extends FieldMapper {
         private final Parameter<SimilarityProvider> similarity = TextParams.similarity(m -> toType(m).similarity);
 
         private final Parameter<String> normalizer
-            = Parameter.stringParam("normalizer", false, m -> toType(m).normalizerName, "default");
+            = Parameter.stringParam("normalizer", false, m -> toType(m).normalizerName, null).acceptsNull();
 
         private final Parameter<Boolean> splitQueriesOnWhitespace
             = Parameter.boolParam("split_queries_on_whitespace", true, m -> toType(m).splitQueriesOnWhitespace, false);
@@ -144,7 +143,7 @@ public final class KeywordFieldMapper extends FieldMapper {
             NamedAnalyzer searchAnalyzer = Lucene.KEYWORD_ANALYZER;
             NamedAnalyzer quoteAnalyzer = Lucene.KEYWORD_ANALYZER;
             String normalizerName = this.normalizer.getValue();
-            if (Objects.equals(normalizerName, "default") == false) {
+            if (normalizerName != null) {
                 assert indexAnalyzers != null;
                 normalizer = indexAnalyzers.getNormalizer(normalizerName);
                 if (normalizer == null) {

+ 16 - 1
server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java

@@ -123,7 +123,8 @@ public class KeywordFieldMapperTests extends MapperTestCase {
             Map.of("default", new NamedAnalyzer("default", AnalyzerScope.INDEX, new StandardAnalyzer())),
             Map.ofEntries(
                 Map.entry("lowercase", new NamedAnalyzer("lowercase", AnalyzerScope.INDEX, new LowercaseNormalizer())),
-                Map.entry("other_lowercase", new NamedAnalyzer("other_lowercase", AnalyzerScope.INDEX, new LowercaseNormalizer()))
+                Map.entry("other_lowercase", new NamedAnalyzer("other_lowercase", AnalyzerScope.INDEX, new LowercaseNormalizer())),
+                Map.entry("default", new NamedAnalyzer("default", AnalyzerScope.INDEX, new LowercaseNormalizer()))
             ),
             Map.of(
                 "lowercase",
@@ -339,6 +340,20 @@ public class KeywordFieldMapperTests extends MapperTestCase {
         assertEquals(DocValuesType.SORTED_SET, fieldType.docValuesType());
     }
 
+    public void testNormalizerNamedDefault() throws IOException {
+        // you can call a normalizer 'default' but it won't be applied unless you specifically ask for it
+        DocumentMapper mapper = createDocumentMapper(mapping(b -> {
+            b.startObject("field").field("type", "keyword").endObject();
+            b.startObject("field2").field("type", "keyword").field("normalizer", "default").endObject();
+        }));
+        ParsedDocument doc = mapper.parse(source(b -> {
+            b.field("field", "FOO");
+            b.field("field2", "FOO");
+        }));
+        assertEquals(new BytesRef("FOO"), doc.rootDoc().getField("field").binaryValue());
+        assertEquals(new BytesRef("foo"), doc.rootDoc().getField("field2").binaryValue());
+    }
+
     public void testParsesKeywordNestedEmptyObjectStrict() throws IOException {
         DocumentMapper defaultMapper = createDocumentMapper(fieldMapping(this::minimalMapping));