将映射与弹性搜索的高级 REST JAVA 客户端异步放置 - 已弃用的错误



我遵循这个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"位于不同的包中:

  1. org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest
  2. 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

相关内容

  • 没有找到相关文章

最新更新