From 6fd93368f1db2277d00bec9f2628224d652ceab1 Mon Sep 17 00:00:00 2001 From: Jim Ferenczi Date: Fri, 18 May 2018 12:00:33 +0200 Subject: [PATCH] Ignore empty completion input This change makes sure that an empty completion input does not throw an IAE when indexing. Instead the input is ignored and the completion field is added in the list of ignored fields for the document. Closes #23121 --- .../index/mapper/CompletionFieldMapper.java | 4 ++++ .../index/mapper/CompletionFieldMapperTests.java | 13 +++++++++++++ 2 files changed, 17 insertions(+) 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 {