Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
<img src="//i.stack.imgur.com/RUiNP.png" height="16" width="18" alt="" class="sponsor tag img">elasticsearch Elasticsearch查询字符串的客户端验证_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nest - Fatal编程技术网 elasticsearch Elasticsearch查询字符串的客户端验证,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch Elasticsearch查询字符串的客户端验证,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch Elasticsearch查询字符串的客户端验证

elasticsearch Elasticsearch查询字符串的客户端验证,elasticsearch,nest,elasticsearch,Nest,我有一个应用程序,它使用NEST(Elasticsearch.NET客户端)与Elasticsearch集群通信。集成允许用户为查询的“查询字符串”部分指定输入 用户可能输入了无效的查询。说“AND”,这是无效的,因为谓词不完整。但是从Elasticsearch返回的错误消息非常详细,并且包含的术语不是非常友好,比如“所有碎片都失败了” 是否有一种方法可以向用户提供更有意义的错误消息(比如“坏谓词”)。理想情况下,用户搜索字符串将在没有Elasticsearch往返的情况下进行验证,但我会接受一

我有一个应用程序,它使用NEST(Elasticsearch.NET客户端)与Elasticsearch集群通信。集成允许用户为查询的“查询字符串”部分指定输入

用户可能输入了无效的查询。说“AND”,这是无效的,因为谓词不完整。但是从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,并将其作为一个选项进行了探索。我可以预先验证所有查询,这至少可以清楚地表明错误是查询语法错误还是其他错误。但这有点笨拙。正如我所说,理想情况下,我可以在不需要额外往返的情况下获得验证,但更关键的是,这仍然可以不要给我“简单的错误信息”。