Reputation: 2264
I am trying to create a dynamic template for elastic using RestHighLevelClient. The commented out code snippet in getMapping()
is for static mapping which works. However, I am running into issues when attempting to create a dynamic mapping.
My intention is to treat any attribute that ends with _id
as long and any attribute that end with _message
as text.
Can someone please point what I am doing wrong?
":{"root_cause":[{"type":"class_cast_exception","reason":"class_cast_exception: java.util.LinkedHashMap cannot be cast to java.util.List"}],"type":"mapper_parsing_exception","reason":"Failed to parse mapping [_doc]: java.util.LinkedHashMap cannot be cast to java.util.List","caused_by":{"type":"class_cast_exception","reason":"class_cast_exception: java.util.LinkedHashMap cannot be cast to java.util.List"}},"status":400}
My code snippet:
Main method:
CreateIndexRequest request = new CreateIndexRequest(indexName);
request.settings(Settings.builder()
.put("index.number_of_shards", 3)
.put("index.number_of_replicas", 2)
);
request.mapping("_doc", getMapping());
CreateIndexResponse createIndexResponse = esClient.indices().create(request, RequestOptions.DEFAULT);
Helper Method:
private static XContentBuilder getMapping() throws IOException {
XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("_doc")
.startObject("dynamic_templates")
.startObject("id")
.field("match", "*_id")
.field("match_mapping_type", "long")
.endObject()
.startObject("message")
.field("match", "*_message")
.field("match_mapping_type", "string")
.endObject()
.endObject()
.endObject()
.endObject();
/*XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("_doc")
.startObject("properties")
.startObject("user")
.field("type", "text")
.field("index", true)
.endObject()
.startObject("message")
.field("type", "text")
.field("index", true)
.endObject()
.endObject()
.endObject()
.endObject();*/
return mappingBuilder;
}
Reference Guide: https://www.elastic.co/guide/en/elasticsearch/guide/master/custom-dynamic-mapping.html
Upvotes: 1
Views: 1198
Reputation: 21
The dynamic templates is array. For example, Elasticsearch 7.1.0
private XContentBuilder buildDynamicTemplates() throws IOException {
XContentBuilder dynamicTemplate = XContentFactory.jsonBuilder();
dynamicTemplate.startObject();
{
dynamicTemplate = DynamicTemplateFactory.templateBuilder(dynamicTemplate);
}
dynamicTemplate.endObject();
return dynamicTemplate;
}
private static XContentBuilder builderTemplate() throws IOException {
XContentBuilder dynamicTemplate = XContentFactory.jsonBuilder();
dynamicTemplate.startObject();
dynamicTemplate.startArray("dynamic_templates");
{
dynamicTemplate.startObject();
{
dynamicTemplate.startObject("strings_as_keywords");
{
dynamicTemplate.field("match", "*");
dynamicTemplate.field("match_mapping_type", "string");
dynamicTemplate.startObject("mapping");
{
dynamicTemplate.field("type", "keyword");
}
dynamicTemplate.endObject();
}
dynamicTemplate.endObject();
}
dynamicTemplate.endObject();
}
dynamicTemplate.endArray();
dynamicTemplate.endObject();
return dynamicTemplate;
}
Upvotes: 1