如何使用Java RestHighLevelClient提取ElasticsearchException的真实错误根因
问题根因
你通过Throwable.getCause()遍历异常栈的方式只能拿到Java侧封装的外层异常。RestHighLevelClient返回的ElasticsearchException及其子类会将ES服务端返回的结构化错误信息单独存储在类属性中,不会放入Java异常的cause链,因此只能拿到外层的search_phase_execution_exception错误。
解决方案
Elasticsearch官方已经在ElasticsearchException类中内置了getRootCauses()方法,直接对应ES返回体中的root_cause数组,调用即可直接获取底层真实根因,示例代码如下:
import org.elasticsearch.ElasticsearchException; import org.elasticsearch.ElasticsearchStatusException; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import java.util.List; // 业务请求逻辑 try { SearchRequest searchRequest = new SearchRequest("your_index"); // 构造查询条件逻辑省略 SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); } catch (ElasticsearchStatusException e) { // 获取ES服务端返回的所有根因列表 List<ElasticsearchException> rootCauseList = e.getRootCauses(); if (!rootCauseList.isEmpty()) { ElasticsearchException realRootCause = rootCauseList.get(0); // 输出你需要的type和reason信息 System.out.printf("\"type\": \"%s\",%n\"reason\": \"%s\"%n", realRootCause.getType(), realRootCause.getMessage() ); } }
补充说明
如果有场景需要获取分片层面的错误详情,也可以调用getFailedShards()方法遍历所有失败分片的错误信息,和root_cause中返回的根因内容一致。
内容的提问来源于stack exchange,提问作者Nishikant Tayade
相关产品推荐
相关产品推荐

