【问题标题】:Elastic Search 7 High level Client Create Index with mappingElastic Search 7 高级客户端使用映射创建索引
【发布时间】:2020-02-06 16:52:41
【问题描述】:

我正在使用弹性搜索 7.0。 我有一个必须保存到弹性模型的模型。

当索引不存在时,我尝试将文档直接保存到弹性:

final IndexRequest indexRequest = new IndexRequest("seminar_map", "seminar", id)
                    .source(new Gson().toJson(object), XContentType.JSON);
            indexRequest.id(id);
final IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);

一切正常,文档将保存到弹性。

但我想要一个自定义分析器,我需要更改映射类型。

所以我尝试在保存任何文档之前设置索引和映射:

try {
            CreateIndexRequest request = new CreateIndexRequest(index);
            request.settings(Settings.builder()
                    .loadFromSource(Strings.toString(jsonBuilder()
                            .startObject()
                            .startObject("analysis")
                            .startObject("analyzer")
                            .startObject("case_insensitive_analyzer")
                            .field("tokenizer", "keyword")
                            .field("type", "custom")
                            .field("filter", new String[]{"lowercase"})
                            .endObject()
                            .endObject()
                            .endObject()
                            .endObject()), XContentType.JSON)
            );

            XContentBuilder builder = XContentFactory.jsonBuilder();
            builder.startObject();
            {
                builder.startObject("properties");
                {
                    builder.startObject("seminar_nummer");
                    {
                        builder.field("analyzer", "case_insensitive_analyzer");
                    }
                    builder.endObject();
                }
                builder.endObject();
            }
            builder.endObject();
            request.mapping("_doc",builder);

            return client.indices().create(request, RequestOptions.DEFAULT);

但我得到了错误:

Elasticsearch exception [type=illegal_argument_exception, reason=The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true.]

我该如何解决这个错误?

创建一个索引和一个不是所有参数的映射然后保存比创建的参数更多的文档的计划是否正确。 那么弹性会将其他缺少的参数添加到映射中还是我必须在创建索引部分中设置完整的映射?

【问题讨论】:

    标签: java elasticsearch resthighlevelclient


    【解决方案1】:

    错误来自您正在创建的 JSON 中的 _doc,并且由于 this 而弹性抱怨它。

    这里有两个选项:

    1. 在网址中添加include_type_name=true

    1. 将此行request.mapping("_doc",builder); 替换为request.source(builder);

    有关详细信息,请参阅文档:

    1. https://www.elastic.co/guide/en/elasticsearch/reference/7.5/removal-of-types.html#_schedule_for_removal_of_mapping_types(注意6.8和7.X的区别)

    2. https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-put-mapping.html#CO385-1

    【讨论】:

    • 嘿,- 1. 选项:如何使用RestHighLevelClient 将参数添加到 url? - 2. 选项:更改为request.source(builder) 抛出异常Elasticsearch exception [type=illegal_argument_exception, reason=unknown setting [index.properties.seminar_nummer.type] please check that any required plugins are installed, or check the breaking changes documentation for removed settings] 参数的层次结构内是否有任何变化?
    • 关于 url 参数:你需要降低一个抽象级别并使用 Low Level Rest Client。
    • 你的例子还是一样吗?检查您是否为seminar_nummer 字段提供了有效的映射类型,例如类型:文本。查看文档,了解有效映射的外观并使用客户端重建它:elastic.co/guide/en/elasticsearch/reference/current/…
    • 分析器参数应该可以工作。使用邮递员将seminar_nummer的映射设置为:"seminar_nummer": { "type": "text", "analyzer": "case_insensitive_analyzer", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }并将参数更改为 type : text 相同的异常
    • 不是分析器,您需要 builder.startObject("seminar_nummer") 下的每个字段/属性定义的映射类型
    【解决方案2】:

    类型在 Elastic 7.x 中已弃用,并将在未来的弹性版本中删除。 将 request.mapping("_doc",builder) 更改为 request.mapping(builder) 应该可以工作。

    对于第二个问题,Yes elasticsearch会在我们保存文档时添加映射中没有提到的缺失字段。

    【讨论】:

    【解决方案3】:

    我还尝试将创建索引与设置和映射部分分开。 创建索引 + 设置运行良好。

    但步骤添加映射不起作用:

    final PutMappingRequest requestMapping = new PutMappingRequest("seminar_map");
    
                XContentBuilder builder = XContentFactory.jsonBuilder();
                builder.startObject();
                {
                        builder.startObject("properties");
                        {
                            builder.startObject("seminar_nummer");
                            {
                                builder.field("analyzer", "case_insensitive_analyzer");
                            }
                            builder.endObject();
                        }
                        builder.endObject();
                }
                builder.endObject();
                requestMapping.source(builder);
    
                client.indices().putMapping(requestMapping, RequestOptions.DEFAULT);
    

    Dies gibt aber leider den Fehler: org.elasticsearch.action.ActionRequestValidationException: Validation Failed: 1: mapping type is missing;

    但是当我向请求添加类型时: requestMapping.type("_doc") 它抛出异常

    Elasticsearch exception [type=illegal_argument_exception, reason=Types cannot be provided in put mapping requests, unless the include_type_name parameter is set to true.]
    

    所以它不适用于类型并且没有类型也不起作用:-D

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 2021-10-20
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多