Асинхронно разместить сопоставление с клиентом REST JAVA высокого уровня эластичного поиска - устаревшая ошибка

Я следую этой документации по эластичному поиску, чтобы создать сопоставление для моего индекса эластичного поиска с именем «контакты».

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, потому что это версия моего развертывания Elastic Search. Команда put mapping теперь работает. Однако я не могу заставить работать асинхронный вызов. Если я раскомментирую этот вызов, Eclipse сообщит мне, что эта функция устарела и я должен использовать новую. Однако новый метод выглядит идентично устаревшему (те же параметры, то же имя). Какая разница? И как мне сказать Eclipse использовать новую версию?

Устарело. Этот метод использует старый объект запроса, который все еще относится к типам, что является устаревшей функцией. Вместо этого следует использовать метод putMappingAsync (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 (). putMappingAsync (запрос, RequestOptions.DEFAULT, listener);

    client.close();
}

person GNG    schedule 03.03.2020    source источник
comment
Какая версия elasticsearch?   -  person Nishant    schedule 03.03.2020
comment
Эластичный поиск Версия 7.5.2   -  person GNG    schedule 03.03.2020


Ответы (1)


Я думаю, вы импортировали не тот класс. В разных пакетах есть два класса 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
          }
        });

Смотрите также:

person Mincong Huang    schedule 04.04.2020