首页 > 解决方案 > Elasticsearch REST 客户端 MultiGet——GetResult 始终为空

问题描述

我正在构建一个MultiGetRequest来验证 Elasticsearch 中是否存在记录。

这是我的方法:

@Scheduled(cron = "${es.doSomething}")
public List<Record> doSomething() {
    MultiGetRequest multiExistRequest = new MultiGetRequest();
    someService.findAll().forEach(record -> {
        String id = record.get("id").asText();
        multiExistRequest.add(new MultiGetRequest.Item("_all", "type", id)
                .fetchSourceContext(FetchSourceContext.FETCH_SOURCE)
                .storedFields("_none_"));
    });

    BulkRequest bulkDeleteRequest = new BulkRequest();
    final CountDownLatch existLatch = new CountDownLatch(multiExistRequest.getItems().size());
    ActionListener<MultiGetResponse> existListener = new ActionListener<MultiGetResponse>() {
        @Override
        public void onResponse(MultiGetResponse responses) {
            responses.forEach(response -> {
                assert response.getFailure() == null;
                GetResponse getResponse = response.getResponse();
                if (getResponse.isExists()) {
                    bulkDeleteRequest.add(new DeleteRequest(response.getIndex(), response.getType(), response.getId()));
                }
                existLatch.countDown();
            });
        }

        @Override
        public void onFailure(Exception e) {
            // TODO -- add retry logic
            LOGGER.error(e.getMessage(), e);
            existLatch.countDown();
        }
    };

    client.multiGetAsync(multiExistRequest, existListener);
    try {
        existLatch.await();
    } catch (InterruptedException e) {
        LOGGER.error("Latch was interrupted", e);
    }

    // Do more stuff...
}

不幸的是,getResponse.isExists()抛出 aNullPointerException并且底层GetResult为空。为什么会这样?看起来请求成功并返回 200:

java.io.IOException: Unable to parse response body for Response{requestLine=POST /_mget HTTP/1.1, host=http://elasticsearch:9200, response=HTTP/1.1 200 OK}
at org.elasticsearch.client.RestHighLevelClient$1.onSuccess(RestHighLevelClient.java:582) ~[elasticsearch-rest-high-level-client-6.3.2.jar!/:6.3.2]
at org.elasticsearch.client.RestClient$FailureTrackingResponseListener.onSuccess(RestClient.java:621) [elasticsearch-rest-client-6.3.2.jar!/:6.3.2]
at org.elasticsearch.client.RestClient$1.completed(RestClient.java:375) [elasticsearch-rest-client-6.3.2.jar!/:6.3.2]
at org.elasticsearch.client.RestClient$1.completed(RestClient.java:366) [elasticsearch-rest-client-6.3.2.jar!/:6.3.2]
at org.apache.http.concurrent.BasicFuture.completed(BasicFuture.java:123) [httpcore-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:181) [httpasyncclient-4.1.4.jar!/:4.1.4]
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:442) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:332) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81) [httpasyncclient-4.1.4.jar!/:4.1.4]
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39) [httpasyncclient-4.1.4.jar!/:4.1.4]
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588) [httpcore-nio-4.4.10.jar!/:4.4.10]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181]
Caused by: java.lang.NullPointerException: null
    at some.random.package.elasticsearch.ElasticsearchService$1.lambda$onResponse$0(ElasticsearchService.java:81) ~[classes!/:na]
    at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_181]
    at some.random.package.elasticsearch.ElasticsearchService$1.onResponse(ElasticsearchService.java:78) ~[classes!/:na]
    at some.random.package.elasticsearch.ElasticsearchService$1.onResponse(ElasticsearchService.java:75) ~[classes!/:na]
    at org.elasticsearch.client.RestHighLevelClient$1.onSuccess(RestHighLevelClient.java:580) ~[elasticsearch-rest-high-level-client-6.3.2.jar!/:6.3.2]
    ... 18 common frames omitted

我正在使用 Elasticsearch 高级 REST 客户端 6.3.2。

标签: javaelasticsearch

解决方案


推荐阅读