diff --git a/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java b/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java index 9160513d0d0..88f7c57a8a7 100644 --- a/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java @@ -278,7 +278,7 @@ public abstract class AbstractFieldMapper implements FieldMapper, Mapper { protected float boost; protected final FieldType fieldType; protected final NamedAnalyzer indexAnalyzer; - protected final NamedAnalyzer searchAnalyzer; + protected NamedAnalyzer searchAnalyzer; protected PostingsFormatProvider postingsFormat; protected final SimilarityProvider similarity; @@ -557,15 +557,6 @@ public abstract class AbstractFieldMapper implements FieldMapper, Mapper { } else if (!this.indexAnalyzer.name().equals(fieldMergeWith.indexAnalyzer.name())) { mergeContext.addConflict("mapper [" + names.fullName() + "] has different index_analyzer"); } - if (this.searchAnalyzer == null) { - if (fieldMergeWith.searchAnalyzer != null) { - mergeContext.addConflict("mapper [" + names.fullName() + "] has different search_analyzer"); - } - } else if (fieldMergeWith.searchAnalyzer == null) { - mergeContext.addConflict("mapper [" + names.fullName() + "] has different search_analyzer"); - } else if (!this.searchAnalyzer.name().equals(fieldMergeWith.searchAnalyzer.name())) { - mergeContext.addConflict("mapper [" + names.fullName() + "] has different search_analyzer"); - } if (this.similarity == null) { if (fieldMergeWith.similarity() != null) { @@ -583,6 +574,9 @@ public abstract class AbstractFieldMapper implements FieldMapper, Mapper { if (fieldMergeWith.postingsFormat != null) { this.postingsFormat = fieldMergeWith.postingsFormat; } + if (fieldMergeWith.searchAnalyzer != null) { + this.searchAnalyzer = fieldMergeWith.searchAnalyzer; + } if (fieldMergeWith.customFieldDataSettings != null) { if (!Objects.equal(fieldMergeWith.customFieldDataSettings, this.customFieldDataSettings)) { this.customFieldDataSettings = fieldMergeWith.customFieldDataSettings; diff --git a/src/test/java/org/elasticsearch/test/unit/index/mapper/merge/TestMergeMapperTests.java b/src/test/java/org/elasticsearch/test/unit/index/mapper/merge/TestMergeMapperTests.java index f866f4609a3..9da8a172926 100644 --- a/src/test/java/org/elasticsearch/test/unit/index/mapper/merge/TestMergeMapperTests.java +++ b/src/test/java/org/elasticsearch/test/unit/index/mapper/merge/TestMergeMapperTests.java @@ -20,6 +20,7 @@ package org.elasticsearch.test.unit.index.mapper.merge; import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.index.analysis.NamedAnalyzer; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.test.unit.index.mapper.MapperTests; import org.testng.annotations.Test; @@ -83,4 +84,44 @@ public class TestMergeMapperTests { assertThat(mergeResult.conflicts().length, equalTo(1)); assertThat(mergeResult.conflicts()[0], equalTo("object mapping [obj] can't be changed from nested to non-nested")); } + + @Test + public void testMergeSearchAnalyzer() throws Exception { + String mapping1 = XContentFactory.jsonBuilder().startObject().startObject("type") + .startObject("properties").startObject("field").field("type", "string").field("search_analyzer", "whitespace").endObject().endObject() + .endObject().endObject().string(); + String mapping2 = XContentFactory.jsonBuilder().startObject().startObject("type") + .startObject("properties").startObject("field").field("type", "string").field("search_analyzer", "keyword").endObject().endObject() + .endObject().endObject().string(); + + DocumentMapper existing = MapperTests.newParser().parse(mapping1); + DocumentMapper changed = MapperTests.newParser().parse(mapping2); + + assertThat(((NamedAnalyzer) existing.mappers().name("field").mapper().searchAnalyzer()).name(), equalTo("whitespace")); + DocumentMapper.MergeResult mergeResult = existing.merge(changed, mergeFlags().simulate(false)); + + assertThat(mergeResult.hasConflicts(), equalTo(false)); + assertThat(((NamedAnalyzer) existing.mappers().name("field").mapper().searchAnalyzer()).name(), equalTo("keyword")); + } + + @Test + public void testNotChangeSearchAnalyzer() throws Exception { + String mapping1 = XContentFactory.jsonBuilder().startObject().startObject("type") + .startObject("properties").startObject("field").field("type", "string").field("search_analyzer", "whitespace").endObject().endObject() + .endObject().endObject().string(); + String mapping2 = XContentFactory.jsonBuilder().startObject().startObject("type") + .startObject("properties").startObject("field").field("type", "string").field("postings_format", "direct").endObject().endObject() + .endObject().endObject().string(); + + DocumentMapper existing = MapperTests.newParser().parse(mapping1); + DocumentMapper changed = MapperTests.newParser().parse(mapping2); + + assertThat(((NamedAnalyzer) existing.mappers().name("field").mapper().searchAnalyzer()).name(), equalTo("whitespace")); + DocumentMapper.MergeResult mergeResult = existing.merge(changed, mergeFlags().simulate(false)); + + assertThat(mergeResult.hasConflicts(), equalTo(false)); + assertThat(((NamedAnalyzer) existing.mappers().name("field").mapper().searchAnalyzer()).name(), equalTo("whitespace")); + assertThat((existing.mappers().name("field").mapper().postingsFormatProvider()).name(), equalTo("direct")); + } + }