错误Lucene语法的java查询字符串查询
我正在对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 楼答案
正斜杠是查询字符串查询语法中的reserved character,用于通过正则表达式进行搜索,因此需要对其进行转义
你需要使用
"\\/xyz"
而不是"/xyz"
请注意,甚至Kibana也不会解析用户输入的正确性。如果想事先检查查询是否有效,可以使用Lucene的^{} 尝试在将查询发送到ES之前解析查询
将查询字符串的功能传递给最终用户是危险的。如果您真的需要为他们提供某种免费文本搜索,请考虑使用{A3},因为它不会抛出任何异常。p>