Improve error message for parse failures of completion fields (#27297)

Fix spacing/grammar/punctuation, and include the field name and location in the source document.
This commit is contained in:
David Turner 2017-11-09 10:45:44 +00:00 committed by GitHub
parent a34c2f0b8d
commit 1c6f5ce9cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 2 deletions

View File

@ -30,9 +30,9 @@ import org.apache.lucene.search.suggest.document.FuzzyCompletionQuery;
import org.apache.lucene.search.suggest.document.PrefixCompletionQuery;
import org.apache.lucene.search.suggest.document.RegexCompletionQuery;
import org.apache.lucene.search.suggest.document.SuggestField;
import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.Version;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.ParsingException;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.common.util.set.Sets;
@ -560,7 +560,7 @@ public class CompletionFieldMapper extends FieldMapper implements ArrayValueMapp
}
}
} else {
throw new ElasticsearchParseException("failed to parse expected text or object got" + token.name());
throw new ParsingException(parser.getTokenLocation(), "failed to parse [" + parser.currentName() + "]: expected text or object, but got " + token.name());
}
}

View File

@ -163,6 +163,25 @@ public class CompletionFieldMapperTests extends ESSingleNodeTestCase {
assertSuggestFields(fields, 1);
}
public void testParsingFailure() throws Exception {
String mapping = jsonBuilder().startObject().startObject("type1")
.startObject("properties").startObject("completion")
.field("type", "completion")
.endObject().endObject()
.endObject().endObject().string();
DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser().parse("type1", new CompressedXContent(mapping));
MapperParsingException e = expectThrows(MapperParsingException.class, () ->
defaultMapper.parse(SourceToParse.source("test", "type1", "1", XContentFactory.jsonBuilder()
.startObject()
.field("completion", 1.0)
.endObject()
.bytes(),
XContentType.JSON)));
assertEquals("failed to parse [completion]: expected text or object, but got VALUE_NUMBER", e.getCause().getMessage());
}
public void testParsingMultiValued() throws Exception {
String mapping = jsonBuilder().startObject().startObject("type1")
.startObject("properties").startObject("completion")