我遵循这个Elastic Search文档为我的Elastic搜索索引创建一个名为"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();
}
这很奇怪,因为我以文档为例。我使用的是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(请求,RequestOptions.DEFAULT,侦听器(;
client.close();
}
我认为您导入了错误的类。有两个类"PutMappingRequest"位于不同的包中:
org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest
org.elasticsearch.client.indices.PutMappingRequest
您应该使用第二个来避免异常。它由Java高级REST客户端提供。要修复异常"缺少映射类型">,您只需要更改导入语句,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
}
});
另请参阅:
- 此答案的测试用例StackOverflow60500157IT.java
- Java高级REST客户端»索引API»放置映射API