elasticsearch Elasticsearch查询字符串的客户端验证
我有一个应用程序,它使用NEST(Elasticsearch.NET客户端)与Elasticsearch集群通信。集成允许用户为查询的“查询字符串”部分指定输入 用户可能输入了无效的查询。说“AND”,这是无效的,因为谓词不完整。但是从Elasticsearch返回的错误消息非常详细,并且包含的术语不是非常友好,比如“所有碎片都失败了”elasticsearch Elasticsearch查询字符串的客户端验证,elasticsearch,nest,elasticsearch,Nest,我有一个应用程序,它使用NEST(Elasticsearch.NET客户端)与Elasticsearch集群通信。集成允许用户为查询的“查询字符串”部分指定输入 用户可能输入了无效的查询。说“AND”,这是无效的,因为谓词不完整。但是从Elasticsearch返回的错误消息非常详细,并且包含的术语不是非常友好,比如“所有碎片都失败了” 是否有一种方法可以向用户提供更有意义的错误消息(比如“坏谓词”)。理想情况下,用户搜索字符串将在没有Elasticsearch往返的情况下进行验证,但我会接受一
是否有一种方法可以向用户提供更有意义的错误消息(比如“坏谓词”)。理想情况下,用户搜索字符串将在没有Elasticsearch往返的情况下进行验证,但我会接受一个更简单的错误消息,尽管我可以得到它。Elasticsearch返回的错误消息很详细,但对于解析类似错误,Elasticsearch会抛出一个
QueryParsingException
。如果仔细检查错误消息,将在整个错误消息的末尾找到字符串QueryParsingException
。这是您感兴趣的异常(及其消息)。例如,当我在搜索请求中将must
拼写为mus2t
时,我通过Elasticsearch得到一条巨大的错误消息,下面是错误消息的最后一部分
QueryParsingException[[<index name>] bool query does not support [mus2t]]; }]
QueryParsingException[]布尔查询不支持[mus2t]];}]
当我把must
拼写为mus2t
时,我得到了这个。您可以分析并提取此错误消息。您可以使用
QueryParsingException[[<index name>] bool query does not support [mus2t]]; }]
用于以下查询
var validateResponse = client.Validate<Document>(descriptor => descriptor
.Explain()
.Query(query => query
.QueryString(qs => qs
.OnFields(f => f.Name)
.Query("AND"))));
var validateResponse=client.Validate(描述符=>descriptor
.解释
.Query(Query=>Query
.QueryString(qs=>qs
.OnFields(f=>f.Name)
。质询(“及”);
你会得到
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> ...
"*" ...
org.elasticsearch.index.query.QueryParsingException:[indexname]
无法分析查询[和];
org.apache.lucene.queryparser.classic.ParseException:无法解析
“和”:在第1行第0列遇到“”和“”。期待
什么之中的一个:
...
"+" ...
"-" ...
...
"(" ...
"*" ...
...
...
...
...
...
"[" ...
"{" ...
...
...
"*" ...
对于最终用户来说仍然不是那么完美,它需要往返ES,但可能会有所帮助。这并不能回答您的问题,但作为参考,直接向用户公开查询字符串语法通常不是一个好主意。@GregMarzouka我非常有兴趣了解更多这方面的信息。您有什么建议吗?这对我有用,我明白了
QueryParsingException[]未能分析查询[和]]
。下一个问题是如何从更大的文本中最好地解析它。我可以很容易地自己编写一个解析器,但是没有任何关于错误文本结构的规范,我不知道是否遗漏了任何细微的细节。也许其他错误场景有一种完全不同的文本格式?起初我将此响应标记为一个答案,但我不知道n retrospect,尽管这是一个有用的见解,但它仍然远远达不到我真正想要的。例如,如果它不是QueryParsingException
,我如何获得“用户友好”错误?如何根据错误响应确定“磁盘已损坏”等关键服务器错误之间的区别还有一些更平庸的东西,比如“格式糟糕的查询”?有帮助,是的。我确实遇到过验证API,并将其作为一个选项进行了探索。我可以预先验证所有查询,这至少可以清楚地表明错误是查询语法错误还是其他错误。但这有点笨拙。正如我所说,理想情况下,我可以在不需要额外往返的情况下获得验证,但更关键的是,这仍然可以不要给我“简单的错误信息”。