elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java 如何捕获无效的Elasticsearch查询?

Java 如何捕获无效的Elasticsearch查询?,java,elasticsearch,Java,elasticsearch,给定一个无效查询,Elasticsearch的Java API(1.1.0)抛出一个SearchPhaseExecutionException。此异常没有“原因”,但有如下“消息”: 执行阶段[query\u fetch]失败,所有碎片失败;shardFailures{[bwUSN171Ru6rY1-su5-48A][f2f0i20hrf][0]:SearchParseException[[f2f0i20hrf][0]:from[-1],size[0]:解析失败[未能解析源[{“size”:0,

给定一个无效查询,Elasticsearch的Java API(1.1.0)抛出一个
SearchPhaseExecutionException
。此异常没有“原因”,但有如下“消息”:

执行阶段[query\u fetch]失败,所有碎片失败;shardFailures{[bwUSN171Ru6rY1-su5-48A][f2f0i20hrf][0]:SearchParseException[[f2f0i20hrf][0]:from[-1],size[0]:解析失败[未能解析源[{“size”:0,“query”:{“bool”:{“must”:{“term”:{“count”:“}])]];嵌套:NumberFormatException[用于输入字符串:”;


除了对
SearchParseException
执行字符串搜索或先执行查询之外,我如何区分无效查询和其他错误?

在这种情况下,我建议在执行查询之前使用validate query:

ValidateQueryRequest validateQueryRequest = new ValidateQueryRequest(indexName);
validateQueryRequest.source(jsonContent);
validateQueryRequest.explain(true);

ActionFuture<ValidateQueryResponse> future = client.admin().indices().validateQuery(validateQueryRequest); // the client is org.elasticsearch.client.Client
ValidateQueryResponse response = future.get(); // typical java future as response
System.out.println(response.isValid()); // true or false
System.out.println(response.getQueryExplanation().size()); // size of explanations why the query is incorrect
ValidateQueryRequest ValidateQueryRequest=新的ValidateQueryRequest(indexName);
validateQueryRequest.source(jsonContent);
validateQueryRequest.explain(true);
ActionFuture=client.admin().index().validateQuery(validateQueryRequest);//客户端是org.elasticsearch.client.client
ValidateQueryResponse=future.get();//典型的java未来作为响应
System.out.println(response.isValid());//真假
System.out.println(response.getQueryExplanation().size());//解释查询不正确原因的大小
getError()提供了类似的内容(对于我尝试使用数字字段范围的文本的查询):

org.elasticsearch.index.query.QueryParsingException:[bill\u d20160227t123119]解析失败;java.lang.NumberFormatException:对于输入字符串:“TEST”

有关验证API的更多信息,请访问


希望有帮助

原因是嵌套的异常(
NumberFormatException
以上)。但是,它通常没有上面的那个有用(它本身并没有透露
“count”
是缺少数值的字段),而且显然在字符串中不可用。我意识到这没有多大用处,这就是为什么它不是答案。问题是,据我所知,没有
NumberFormatException
(甚至
SearchParseException
)对象(
getCause()
返回
null
)。我想我可以尝试解析
getMessage()
字符串,但希望找到更好的解决方案。。。