Поместите сопоставление с клиентом EASTTI c REST JAVA высокого уровня поиска асинхронно - устарела ошибка - PullRequest
1 голос
/ 03 марта 2020

Я следую этому Elasti c Поиск документации для создания сопоставления для моего Elasti c Индекс поиска с именем "contacts".

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

В результате выполнения моего кода

не удалось создать сопоставление: Ошибка проверки: 1: тип сопоставления отсутствует;

Вот мой код.

public void createElasticMapping() throws IOException {
    RestHighLevelClient client = createHighLevelRestClient();

    PutMappingRequest request = new PutMappingRequest("contacts");

    ArrayList<Field> fields = new ArrayList<Field>();
    fields.add(new Field("list_id", "integer"));
    fields.add(new Field("contact_id", "integer"));

    Map<String, Object> properties = new HashMap<>();

    for (Field fieldToAdd : fields) {
        Map<String, Object> fieldData = new HashMap<>();
        fieldData.put("type", fieldToAdd.type);
        properties.put(fieldToAdd.name, fieldData);
    }

    Map<String, Object> jsonMap = new HashMap<>();
    jsonMap.put("properties", properties);
    request.source(jsonMap);

    @SuppressWarnings("deprecation")
    org.elasticsearch.action.support.master.AcknowledgedResponse putMappingResponse = client.indices()
            .putMapping(request, RequestOptions.DEFAULT);
    System.out.print(putMappingResponse);

    client.close();
}

Это странно, потому что я следую примеру документации. Я использую версию 7.6.0 клиента Java.


Обновление. Я понизился до версии 7.5.2 клиента Java, потому что это версия моего развертывания Elasti c Search. Команда put mapping теперь работает. Однако я не могу заставить асинхронный вызов работать. Если я раскомментирую этот вызов, Eclipse скажет мне, что эта функция устарела и что я должен использовать новую. Однако новый метод выглядит идентично устаревшему методу (те же параметры, то же имя). Какая разница? И как мне сказать Eclipse использовать новую версию?

Устаревший. Этот метод использует старый объект запроса, который по-прежнему ссылается на типы, - устаревшая функция. Вместо этого следует использовать метод putMappingAsyn c (PutMappingRequest, RequestOptions, ActionListener), который принимает новый объект запроса.

Только синхронный.

    @POST
@Path("/mapping")
public void createElasticMapping() throws IOException {
    RestHighLevelClient client = createHighLevelRestClient();

    PutMappingRequest request = new PutMappingRequest("contacts");

    ArrayList<Field> fields = new ArrayList<Field>();
    fields.add(new Field("list_id", "integer"));
    fields.add(new Field("contact_id", "integer"));

    Map<String, Object> properties = new HashMap<>();

    for (Field fieldToAdd : fields) {
        Map<String, Object> fieldData = new HashMap<>();
        fieldData.put("type", fieldToAdd.type);
        properties.put(fieldToAdd.name, fieldData);
    }

    Map<String, Object> jsonMap = new HashMap<>();
    jsonMap.put("properties", properties);
    request.source(jsonMap);

    org.elasticsearch.action.support.master.AcknowledgedResponse putMappingResponse = client.indices()
            .putMapping(request, RequestOptions.DEFAULT);
    System.out.print(putMappingResponse);

// здесь асинхронный вызов, который не работает. // client.indices (). putMappingAsyn c (запрос, RequestOptions.DEFAULT, слушатель);

    client.close();
}

1 Ответ

0 голосов
/ 04 апреля 2020

Я думаю, вы импортировали не тот класс. Существует два класса «PutMappingRequest», расположенных в разных пакетах:

  1. org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest
  2. org.elasticsearch.client.indices.PutMappingRequest

Вам следует использовать второй, чтобы избежать исключение. Он предоставляется клиентом REST высокого уровня Java. Чтобы исправить исключение «тип отображения отсутствует» , вам просто нужно изменить оператор импорта, и Eclipse скомпилирует с правильным классом. Вам не нужно понижать версию Elasticsearch.

Если вы проверите исходный код клиента Java, вы увидите два метода putMapping(...), определенных с различными входными параметрами. Это перегруженные методы. Только один устарел:

/**
 * Updates the mappings on an index using the Put Mapping API.
 * ...
 *
 * @deprecated This method uses an old request object which still refers to types, a deprecated feature. The method
 * {@link #putMapping(PutMappingRequest, RequestOptions)} should be used instead, which accepts a new request object.
 */
@Deprecated
public AcknowledgedResponse putMapping(
    org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest putMappingRequest,
    RequestOptions options) throws IOException {
    ...
}

public AcknowledgedResponse putMapping(
    PutMappingRequest putMappingRequest,
    RequestOptions options) throws IOException {
    ...
}

Не уверен, что я понял, что вы подразумеваете под асинхронным вызовом не работает. Вот пример использования:

client
    .indices()
    .putMappingAsync(
        request,
        RequestOptions.DEFAULT,
        new ActionListener<>() {
          @Override
          public void onResponse(AcknowledgedResponse r) {
            // TODO handle response here
          }

          @Override
          public void onFailure(Exception e) {
            // TODO handle failure here
          }
        });

См. Также:

...