Browse Source

Mappings: Fix not_analyzed string fields to error when position_increment_gap is set

Currently if a string field is not_analyzed, but a
position_increment_gap is set, it will lookup the default analyzer and
set it, along with the position_increment_gap, before the code which
handles setting the keyword analyzer for not_analyzed fields has a
chance to run. This change adds a parsing check and test for that case.
Ryan Ernst 9 years ago
parent
commit
c85cb37cc4

+ 3 - 0
core/src/main/java/org/elasticsearch/index/mapper/core/StringFieldMapper.java

@@ -164,6 +164,9 @@ public class StringFieldMapper extends FieldMapper implements AllFieldMapper.Inc
         @Override
         public StringFieldMapper build(BuilderContext context) {
             if (positionIncrementGap != POSITION_INCREMENT_GAP_USE_ANALYZER) {
+                if (fieldType.tokenized() == false && fieldType.indexOptions() != IndexOptions.NONE) {
+                    throw new IllegalArgumentException("Cannot set position_increment_gap on not_analyzed field [" + fieldType.name() + "]");
+                }
                 fieldType.setIndexAnalyzer(new NamedAnalyzer(fieldType.indexAnalyzer(), positionIncrementGap));
                 fieldType.setSearchAnalyzer(new NamedAnalyzer(fieldType.searchAnalyzer(), positionIncrementGap));
                 fieldType.setSearchQuoteAnalyzer(new NamedAnalyzer(fieldType.searchQuoteAnalyzer(), positionIncrementGap));

+ 13 - 0
core/src/test/java/org/elasticsearch/index/mapper/string/SimpleStringMappingTests.java

@@ -677,4 +677,17 @@ public class SimpleStringMappingTests extends ESSingleNodeTestCase {
                 () -> mapper.mappers().getMapper("field").fieldType().fielddataBuilder());
         assertThat(e.getMessage(), containsString("Fielddata is disabled"));
     }
+
+    public void testKeywordFieldPositionIncrement() throws IOException {
+        String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
+            .startObject("properties").startObject("field")
+            .field("type", "string")
+            .field("index", "not_analyzed")
+            .field("position_increment_gap", 10)
+            .endObject().endObject().endObject().endObject().string();
+
+        IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
+            () -> parser.parse("type", new CompressedXContent(mapping)));
+        assertThat(e.getMessage(), containsString("Cannot set position_increment_gap on not_analyzed field"));
+    }
 }