Elasti c Search 7 Клиент высокого уровня Создать индекс с отображением - PullRequest
0 голосов
/ 05 февраля 2020

я использую elasti c search 7.0. У меня есть модель, которую нужно сохранить в elasti c.

. Если индекс не существует, я пытаюсь сохранить документы непосредственно в elasti c:

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);
* 1005. * Все работает отлично, и документы будут сохранены в elasti c.

Но я хочу иметь собственный анализатор и мне нужно изменить типы отображения.

Поэтому я попытался установить индекс и отображение перед сохранением любых документов:

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.]

Как я могу исправить эту ошибку?

И Правильно ли создать индекс и отображение с не всеми параметрами, а затем сохранить документы с большим количеством параметров, чем создано. Так добавит ли elasti c другие отсутствующие параметры в сопоставления или мне нужно установить полное сопоставление в части создания индекса?

Ответы [ 3 ]

1 голос
/ 05 февраля 2020

Ошибка возникает из _doc в JSON, который вы создаете, и elasti c жалуется на это из-за этого .

Здесь доступны два варианта:

  1. Добавить include_type_name=true к URL-адресу

ИЛИ

Заменить эту строку 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

0 голосов
/ 06 февраля 2020

Я также пытался разделить индекс создания с настройками и частью отображения. Создание индекса + настройки работает хорошо.

Но шаг добавить отображение не работает:

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

0 голосов
/ 05 февраля 2020

Типы устарели в Elasti c 7.x и будут удалены в будущих версиях elasti c. Изменение request.mapping("_doc",builder) на request.mapping(builder) должно работать.

По второму вопросу Да elasti c search добавит пропущенные поля, которые не упомянуты в отображении, когда мы сохраняем документы.

...