diff options
author | Nilabh Sagar <nilabhsagar@gmail.com> | 2017-04-24 20:05:14 +0530 |
---|---|---|
committer | Nik Everett <nik9000@gmail.com> | 2017-04-24 10:35:14 -0400 |
commit | 373edee29a676444c0f423b9ee202fb0735d3ccd (patch) | |
tree | 83d371f07090f0d4910814f4033d8ab8bde3e908 /core | |
parent | 931198688c2d34555fb7d82a0d2cf34feea70f1d (diff) |
Provide informative error message in case of unknown suggestion context. (#24241)
Provide a list of available contexts when you send an unknown context to the completion suggester.
Diffstat (limited to 'core')
2 files changed, 29 insertions, 1 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMappings.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMappings.java index 0cac17dbb8..bbefbf41b8 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMappings.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMappings.java @@ -81,7 +81,9 @@ public class ContextMappings implements ToXContent { public ContextMapping get(String name) { ContextMapping contextMapping = contextNameMap.get(name); if (contextMapping == null) { - throw new IllegalArgumentException("Unknown context name[" + name + "], must be one of " + contextNameMap.size()); + List<String> keys = new ArrayList<>(contextNameMap.keySet()); + Collections.sort(keys); + throw new IllegalArgumentException("Unknown context name [" + name + "], must be one of " + keys.toString()); } return contextMapping; } diff --git a/core/src/test/java/org/elasticsearch/search/suggest/completion/CategoryContextMappingTests.java b/core/src/test/java/org/elasticsearch/search/suggest/completion/CategoryContextMappingTests.java index a9639c7b46..b9b15341da 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/completion/CategoryContextMappingTests.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/completion/CategoryContextMappingTests.java @@ -29,6 +29,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.json.JsonXContent; +import org.elasticsearch.index.mapper.CompletionFieldMapper.CompletionFieldType; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; @@ -673,6 +674,31 @@ public class CategoryContextMappingTests extends ESSingleNodeTestCase { Exception e = expectThrows(ElasticsearchParseException.class, () -> mapping.parseQueryContext(createParseContext(parser))); assertEquals("category context must be an object, string, number or boolean", e.getMessage()); } + + public void testUnknownQueryContextParsing() throws Exception { + String mapping = jsonBuilder().startObject().startObject("type1") + .startObject("properties").startObject("completion") + .field("type", "completion") + .startArray("contexts") + .startObject() + .field("name", "ctx") + .field("type", "category") + .endObject() + .startObject() + .field("name", "type") + .field("type", "category") + .endObject() + .endArray() + .endObject().endObject() + .endObject().endObject().string(); + + DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser().parse("type1", new CompressedXContent(mapping)); + FieldMapper fieldMapper = defaultMapper.mappers().getMapper("completion"); + CompletionFieldType completionFieldType = (CompletionFieldType) fieldMapper.fieldType(); + + Exception e = expectThrows(IllegalArgumentException.class, () -> completionFieldType.getContextMappings().get("brand")); + assertEquals("Unknown context name [brand], must be one of [ctx, type]", e.getMessage()); + } public void testParsingContextFromDocument() throws Exception { CategoryContextMapping mapping = ContextBuilder.category("cat").field("category").build(); |