我有一个使用NEST(Elasticsearch .NET客户端)与Elasticsearch集群通信的应用程序。集成允许用户指定" query_string"查询的一部分。
用户可能输入无效查询。说" AND",因为谓词不完整而无效。但是从Elasticsearch返回的错误消息非常冗长,并且包含非常用户友好的术语,例如"所有分片都失败了"。
有没有办法可以为用户提供更有意义的错误信息(例如 - "坏谓词")。理想情况下,用户搜索字符串将在没有Elasticsearch往返的情况下进行验证,但我会解决一个更简单的错误消息,但我可以得到它。
答案 0 :(得分:2)
Elasticsearch返回的错误消息很详细,但是对于解析这些错误,Elasticsearch会抛出QueryParsingException
。如果仔细检查错误消息,则会在整个错误消息的末尾找到字符串QueryParsingException
。这是您感兴趣的例外(及其消息)。例如,当我在搜索请求中将must
拼写为mus2t
时,我会收到Elasticsearch的大量错误消息,下面是最后一部分错误信息。
QueryParsingException[[<index name>] bool query does not support [mus2t]]; }]
当我将must
拼写为mus2t
时,我得到了这个。您可以解析并提取此错误消息。
答案 1 :(得分:1)
您可以使用validation api。
用于以下查询
var validateResponse = client.Validate<Document>(descriptor => descriptor
.Explain()
.Query(query => query
.QueryString(qs => qs
.OnFields(f => f.Name)
.Query("AND"))));
你会得到
org.elasticsearch.index.query.QueryParsingException: [indexname]
Failed to parse query [AND];
org.apache.lucene.queryparser.classic.ParseException: Cannot parse
'AND': Encountered " <AND> "AND "" at line 1, column 0. Was expecting
one of:
<NOT> ...
"+" ...
"-" ...
<BAREOPER> ...
"(" ...
"*" ...
<QUOTED> ...
<TERM> ...
<PREFIXTERM> ...
<WILDTERM> ...
<REGEXPTERM> ...
"[" ...
"{" ...
<NUMBER> ...
<TERM> ...
"*" ...
对于最终用户来说仍然不是那么完美,它需要往返ES,但也许它会有所帮助。