我正在对一个 Text
现场。当我使用错误语法的查询时(例如。, "/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"];
在执行查询之前,是否有方法检测此查询是否有错误的语法。比如提前解析查询或者将其与正则表达式匹配?
更新:
对不起,我的问题不清楚。我知道这个查询有一个错误的语法,因为它使用了一些保留字符,实际上,它打算用作regex查询。不过,我需要的是在执行查询之前向客户机提供一条有意义的错误消息,指出他的查询具有错误的语法。
1条答案
按热度按时间quhf5bfb1#
正斜杠是查询字符串查询语法中的保留字符,用于通过正则表达式进行搜索,因此需要对其进行转义。
而不是
"/xyz"
你需要使用"\\/xyz"
请注意,即使kibana也不会解析用户输入的正确性。如果您想事先检查查询是否有效,可以使用lucene的StandardQueryParser
尝试在将查询发送到es之前对其进行分析。将查询字符串的权力交给最终用户是危险的。如果您真的需要为他们提供某种自由文本搜索,请考虑使用
simple_query_string
相反,因为它不会抛出任何异常。