0

我正在使用弹性搜索 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.]

我该如何解决该错误?

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

4

3 回答 3

1

该错误来自_doc您正在创建的 JSON 中的错误,因此弹性抱怨

这里有两个选择:

  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

于 2020-02-05T18:23:05.110 回答
0

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

对于第二个问题,是的,弹性搜索会在我们保存文档时添加映射中未提及的缺失字段。

于 2020-02-05T20:13:26.763 回答
0

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

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

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

死亡 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

于 2020-02-06T08:52:41.703 回答