diff --git a/src/main/java/org/elasticsearch/index/mapper/core/StringFieldMapper.java b/src/main/java/org/elasticsearch/index/mapper/core/StringFieldMapper.java index 4d4b7d6bba8ce..43da31336beb1 100644 --- a/src/main/java/org/elasticsearch/index/mapper/core/StringFieldMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/core/StringFieldMapper.java @@ -382,7 +382,7 @@ protected void doXContentBody(XContentBuilder builder, boolean includeDefaults, if (includeDefaults || positionOffsetGap != Defaults.POSITION_OFFSET_GAP) { builder.field("position_offset_gap", positionOffsetGap); } - if (searchQuotedAnalyzer != null && searchAnalyzer != searchQuotedAnalyzer) { + if (searchQuotedAnalyzer != null && !searchQuotedAnalyzer.name().equals(searchAnalyzer.name())) { builder.field("search_quote_analyzer", searchQuotedAnalyzer.name()); } else if (includeDefaults) { if (searchQuotedAnalyzer == null) { diff --git a/src/test/java/org/elasticsearch/index/mapper/string/SimpleStringMappingTests.java b/src/test/java/org/elasticsearch/index/mapper/string/SimpleStringMappingTests.java index bf50d730eaa11..d4e1c3ef05331 100644 --- a/src/test/java/org/elasticsearch/index/mapper/string/SimpleStringMappingTests.java +++ b/src/test/java/org/elasticsearch/index/mapper/string/SimpleStringMappingTests.java @@ -20,6 +20,8 @@ package org.elasticsearch.index.mapper.string; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; + import org.apache.lucene.index.DocValuesType; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.IndexableField; @@ -27,13 +29,13 @@ import org.apache.lucene.index.Term; import org.apache.lucene.queries.TermFilter; import org.apache.lucene.queries.TermsFilter; -import org.elasticsearch.Version; -import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.ToXContent; +import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.index.IndexService; import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.mapper.ContentPath; @@ -52,6 +54,7 @@ import java.util.Arrays; import java.util.Collections; +import java.util.Map; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.notNullValue; @@ -216,6 +219,79 @@ public void testDefaultsForNotAnalyzed() throws Exception { assertThat(fieldType.omitNorms(), equalTo(false)); assertParseIdemPotent(fieldType, defaultMapper); } + + @Test + public void testSearchQuoteAnalyzerSerialization() throws Exception { + // Cases where search_quote_analyzer should not be added to the mapping. + String mapping = XContentFactory.jsonBuilder().startObject().startObject("type") + .startObject("properties") + .startObject("field1") + .field("type", "string") + .field("position_offset_gap", 1000) + .endObject() + .startObject("field2") + .field("type", "string") + .field("position_offset_gap", 1000) + .field("analyzer", "standard") + .endObject() + .startObject("field3") + .field("type", "string") + .field("position_offset_gap", 1000) + .field("analyzer", "standard") + .field("search_analyzer", "simple") + .endObject() + .startObject("field4") + .field("type", "string") + .field("position_offset_gap", 1000) + .field("analyzer", "standard") + .field("search_analyzer", "simple") + .field("search_quote_analyzer", "simple") + .endObject() + .endObject() + .endObject().endObject().string(); + + DocumentMapper mapper = parser.parse(mapping); + for (String fieldName : Lists.newArrayList("field1", "field2", "field3", "field4")) { + Map serializedMap = getSerializedMap(fieldName, mapper); + assertFalse(serializedMap.containsKey("search_quote_analyzer")); + } + + // Cases where search_quote_analyzer should be present. + mapping = XContentFactory.jsonBuilder().startObject().startObject("type") + .startObject("properties") + .startObject("field1") + .field("type", "string") + .field("position_offset_gap", 1000) + .field("search_quote_analyzer", "simple") + .endObject() + .startObject("field2") + .field("type", "string") + .field("position_offset_gap", 1000) + .field("analyzer", "standard") + .field("search_analyzer", "standard") + .field("search_quote_analyzer", "simple") + .endObject() + .endObject() + .endObject().endObject().string(); + + mapper = parser.parse(mapping); + for (String fieldName : Lists.newArrayList("field1", "field2")) { + Map serializedMap = getSerializedMap(fieldName, mapper); + assertEquals(serializedMap.get("search_quote_analyzer"), "simple"); + } + } + + private Map getSerializedMap(String fieldName, DocumentMapper mapper) throws Exception { + FieldMapper fieldMapper = mapper.mappers().smartNameFieldMapper(fieldName); + XContentBuilder builder = JsonXContent.contentBuilder().startObject(); + fieldMapper.toXContent(builder, ToXContent.EMPTY_PARAMS).endObject(); + builder.close(); + + Map fieldMap = JsonXContent.jsonXContent.createParser(builder.bytes()).mapAndClose(); + @SuppressWarnings("unchecked") + Map result = (Map) fieldMap.get(fieldName); + return result; + } @Test public void testTermVectors() throws Exception {