繁体   English   中英

ElasticSearch 映射动态模板 Java

[英]ElasticSearch Mapping Dynamic Template Java

我正在尝试使用 RestHighLevelClient 为弹性创建动态模板。 getMapping()注释掉的代码片段是用于静态映射的。 但是,我在尝试创建动态映射时遇到了问题。

我的意图是将任何以_id结尾的属性视为长,并将以_message结尾的任何属性视为文本。

有人可以指出我做错了什么吗?

":{"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}

我的代码片段:

主要方法:

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);

辅助方法:

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;
}

参考指南: https : //www.elastic.co/guide/en/elasticsearch/guide/master/custom-dynamic-mapping.html

动态模板是数组。 例如,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;
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM