使用Java在Elasticsearch中执行Update By Query时的NPE

时间:2016-11-03 10:53:52

标签: java elasticsearch spring-data-elasticsearch

我在Spring Boot应用程序中使用Elasticsearch 2.4,我需要使用Java API对远程ES实例执行_update_by_query请求。
我已经找到了在this question完成此任务的方法,但就我的情况而言,我有一个NPE尝试执行.get()功能。

ES的模块包括:

compile 'org.elasticsearch.module:reindex:2.4.1'

这是我现在用于测试的代码段:

UpdateByQueryRequestBuilder request = UpdateByQueryAction.INSTANCE.newRequestBuilder(clientWrapper.getClient());  // clientWrapper is a bean and gets injected
Script script = new Script(
  "ctx._source.testName = \"TEST HAPPENED\"",
  ScriptService.ScriptType.INLINE, null, null);

request.source().setTypes("type");

BulkIndexByScrollResponse r = request
  .source(ES_INDEX_NAME)
  .filter(QueryBuilders.termQuery("testId", "Sk9lzQHdJT0"))
  .script(script)
  .get();  // the exception gets raised here

这是一个包裹的Client bean:

@Bean
public ClientWrapper elasticsearchClient(Client client) {
return new ClientWrapper(
  TransportClient.builder()
    .addPlugin(ReindexPlugin.class)  // here's the plugin that is supposed to work
    .settings(client.settings())
    .build());
}

需要包装器才能通过Spring Boot配置文件进行配置,所以它只是为了方便。

NullPointerException是由调用execute(...)方法引起的 TransportProxyClient

final TransportActionNodeProxy<Request, Response> proxy = proxies.get(action);  // no proxy found here
... 
proxy.execute(node, request, listener);  // NPE here

我想知道自从上面提到的问题以来我是否错过了一些步骤或者使用情况有所改变?

1 个答案:

答案 0 :(得分:4)

您缺少传输信息的配置。它应该是 TransportClient.builder().addPlugin(ReindexPlugin.class) .build().addTransportAddress(new InetSocketTransportAddress( InetAddress.getByName("127.0.0.1"), 9300));