Я следую этому 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();
}