使用错误的Lucene语法查询字符串查询

时间:2017-09-04 11:28:47

标签: java elasticsearch lucene

我正在Text字段上执行Query String Query。当我使用具有错误语法的查询(例如,"/xyz")时,我得到一个异常,表明ElasticSearch无法解析所有分片上的查询:

Caused by: java.util.concurrent.ExecutionException: RemoteTransportException[[PZCU_1Z][127.0.0.1:9300][indices:data/read/search]]; nested: SearchPhaseExecutionException[all shards failed]; nested: QueryShardException[Failed to parse query [/xyz]]; nested: NotSerializableExceptionWrapper[parse_exception: Cannot parse '/xyz': Lexical error at line 1, column 5.  Encountered: <EOF> after : "/xyz"]; nested: NotSerializableExceptionWrapper[token_mgr_error: Lexical error at line 1, column 5.  Encountered: <EOF> after : "/xyz"];

在执行查询本身之前,有没有办法检测此查询的语法是否错误。比如提前解析查询或者将它与正则表达式匹配?

更新

很抱歉,如果我的问题不清楚。我知道这个查询的语法错误,因为它使用了一些保留字符,实际上,它本来是用作正则表达式查询。我需要的是在执行查询之前向客户端提供有意义的错误消息,指示他的查询语法错误。

1 个答案:

答案 0 :(得分:2)

正斜杠是查询字符串查询语法中的reserved character,用于通过正则表达式进行搜索,因此您需要将其转义。

而不是"/xyz"您需要使用"\\/xyz"

请注意,即使是Kibana也不会解析用户输入的正确性。如果您想事先检查查询是否有效,可以使用Lucene的StandardQueryParser尝试解析查询,然后再将其发送给ES。

将查询字符串的强大功能传递给最终用户是危险的。如果您确实需要为他们提供某种自由文本搜索,请考虑使用simple_query_string代替,因为它不会抛出任何异常。