Elasticsearch Java API 客户端 TransportException [es/search] 无法解码响应

问题描述 投票:0回答:1

我正在尝试设置新的 Elasticsearch Java API 客户端。 这是我的配置:

    // Set up elasticsearch cluster hosts
    String[] elasticsearchHosts = elasticsearchEndpoints.split(",");
    HttpHost[] httpHosts = Arrays.stream(elasticsearchHosts)
            .map(HttpHost::create).toArray(HttpHost[]::new);

    // Create the low level client
    final RestClientBuilder restClientbuilder = RestClient.builder(httpHosts);

    // Set elasticsearch user credentials
    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY,
            new UsernamePasswordCredentials(username, password));

    restClientbuilder.setHttpClientConfigCallback(
            b -> b.setDefaultCredentialsProvider(credentialsProvider));

    RestClient restClient = restClientbuilder.build();

    // Create the transport with a Jackson mapper which maps classes to json
    ElasticsearchTransport transport = new RestClientTransport(restClient,
            new JacksonJsonpMapper());

    return new ElasticsearchClient(transport);

我有一个简单的搜索:

  Query termQuery = TermQuery.of(m -> m
                    .field("myField")
                    .value("myValue"))
            ._toQuery();

    var searchRequest =
            co.elastic.clients.elasticsearch.core.SearchRequest.of(s -> s
                    .index("index-name")
                    .query(termQuery));

    SearchResponse<myDTOClass>
            searchResponse = elasticsearchJavaApiClient.search(searchRequest, myDTOClass.class);

发送请求成功,但问题在于响应。错误如下:

co.elastic.clients.transport.TransportException:节点:https://aaa.xxx.com:9200/,状态:200,[es/search]无法解码响应

spring-boot elasticsearch elasticsearch-java-api-client
1个回答
0
投票

我找到原因了,想和大家分享。

原因是搜索响应与我的域对象定义(即myDTOClass)不匹配。

SearchResponse<myDTOClass> searchResponse = elasticsearchJavaApiClient.search(searchRequest, myDTOClass.class);

所以我首先将其更改为Void.class来测试连接。我收到一些空的回复。

然后我使用 ObjectNode.class 它以原始 json 形式返回响应。

这里是文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/reading.html

最后这就是我的解决方案:

SearchResponse<ObjectNode> searchResponse = elasticsearchJavaApiClient.search(searchRequest, ObjectNode.class);

当然,我必须将原始 json 对象转换为我自己的 myDTOClass。

© www.soinside.com 2019 - 2024. All rights reserved.