我正在按照这个 Elastic Search 文档为我的 Elastic Search 索引创建一个名为“联系人”的映射。
运行我的代码导致
创建映射失败:验证失败: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();
}
这很奇怪,因为我遵循文档的示例。我正在使用 Java 客户端的 7.6.0 版本。
更新。我降级到 Java 客户端的 7.5.2 版本,因为这是我的 Elastic Search 部署的版本。put 映射命令现在可以工作了。但是,我无法让异步调用正常工作。如果我取消注释该调用,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(request, RequestOptions.DEFAULT, listener);
client.close();
}