我创建了一个AWS Lambda软件包(Java),其中包含从Amazon S3读取某些文件并将数据推送到AWS ElasticSearch Service的功能。由于我使用的是AWS弹性搜索,因此我无法使用传输客户端,在这种情况下,我正在使用Jest Client通过REST进行推送。问题在于Jest客户端。
这是我的Jest客户端实例:
public JestClient getClient() throws InterruptedException{
final Supplier<LocalDateTime> clock = () -> LocalDateTime.now(ZoneOffset.UTC);
DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
final AWSSigner awsSigner = new AWSSigner(awsCredentialsProvider, REGION, SERVICE, clock);
JestClientFactory factory = new JestClientFactory() {
@Override
protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) {
builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner));
return builder;
}
@Override
protected HttpAsyncClientBuilder configureHttpClient(HttpAsyncClientBuilder builder) {
builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner));
return builder;
}
};
factory.setHttpClientConfig(
new HttpClientConfig.Builder(URL)
.discoveryEnabled(true)
.multiThreaded(true).build());
JestClient jestClient = factory.getObject();
return jestClient;
}
由于AWS Elasticsearch域受IAM访问策略保护,因此我签署了AWS的授权请求(example here)。我使用POJO来索引文档。
我遇到的问题是我无法使用jest客户端实例执行多个操作。例如,如果我首先创建了索引:
client.execute(new CreateIndex.Builder(indexName).build());
以后,我想,例如做一些批量索引:
for (Object object : listOfObjects) {
bulkIndexBuilder.addAction(new Index.Builder(object ).
index(INDEX_NAME).type(DOC_TYPE).build());
}
client.execute(bulkIndexBuilder.build());
只会执行第一个操作而第二个操作将失败。这是为什么?是否可以执行多个操作?
Morover,使用提供的代码,当我想索引文档时,我无法执行超过20个批量操作。基本上,大约20个很好,但除此之外,client.execute(bulkIndexBuilder.build());
只是不执行而客户端关闭。
任何帮助或建议都会得到满足。
更新:
AWS ElasticSearch似乎不允许连接到单个节点。只需关闭Jest客户端.discoveryEnabled(false)
中的节点发现即可解决所有问题。这answer有所帮助。