使用ES出现ElasticsearchStatusException
org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=x_content_parse_exception, reason=[1:68] [bool] failed to parse field [must]]
at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:177)
at org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:1727)
at org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:1704)
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1467)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1424)
at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1394)
at org.elasticsearch.client.RestHighLevelClient.search(RestHighLevelClient.java:930)
先讲最终解决
其实就是在做关键字搜索时出现了null
导致的报错,需要去排除这个因素,我这里就是因为这个原因
所以在涉及到关键字查询字段的时候,需要将字段设置为非空来保证不出错,不然这个错误还挺不好找
(报错不明显)
"query": {
"bool": {
"must": [
{
"terms": {
"from_email.keyword": [
"乱七八糟@bbwt.com",
null,
"乱七八糟@hiedm.cn"
],
"boost": 1.0
}
},
排错
我们通idea的报错信息可以定位到(ElasticsearchQueryUtil.java:370)
,通过点击之后会直接跳转,然后保证自己代码在以前没错现在错的情况下就有绝大可能是数据出现了问题,所以我们去通过断点跟踪数据,拿到报错前的最终数据去其他区域进行同等操作,如果也是报错,那就确定了数据错误
去除空值后得到了正常响应