我正在尝试设置新的 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]无法解码响应
我找到原因了,想和大家分享。
原因是搜索响应与我的域对象定义(即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。