1

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

1 Answer 1

1

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;
  }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.