diff --git a/server/src/main/java/org/elasticsearch/index/mapper/CompletionFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/CompletionFieldMapper.java index af50dfbcb4e18..cf08d93a197de 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/CompletionFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/CompletionFieldMapper.java @@ -449,6 +449,10 @@ public Mapper parse(ParseContext context) throws IOException { // index for (Map.Entry completionInput : inputMap.entrySet()) { String input = completionInput.getKey(); + if (input.trim().isEmpty()) { + context.addIgnoredField(fieldType.name()); + continue; + } // truncate input if (input.length() > maxInputLength) { int len = Math.min(maxInputLength, input.length()); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java index be03a28a0aad2..1381b6e920559 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java @@ -397,6 +397,19 @@ public void testFieldValueValidation() throws Exception { assertThat(cause, instanceOf(IllegalArgumentException.class)); assertThat(cause.getMessage(), containsString("[0x1e]")); } + + // empty inputs are ignored + ParsedDocument doc = defaultMapper.parse(SourceToParse.source("test", "type1", "1", BytesReference + .bytes(XContentFactory.jsonBuilder() + .startObject() + .array("completion", " ", "") + .endObject()), + XContentType.JSON)); + assertThat(doc.docs().size(), equalTo(1)); + assertNull(doc.docs().get(0).get("completion")); + assertNotNull(doc.docs().get(0).getField("_ignored")); + IndexableField ignoredFields = doc.docs().get(0).getField("_ignored"); + assertThat(ignoredFields.stringValue(), equalTo("completion")); } public void testPrefixQueryType() throws Exception {