alwaysAStudent
alwaysAStudent

Reputation: 2264

ElasticSearch Mapping Dynamic Template Java

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

Answers (1)

user8310675
user8310675

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

Related Questions