【问题标题】:Client-side validation of Elasticsearch query stringElasticsearch 查询字符串的客户端验证
【发布时间】:2015-05-10 04:19:11
【问题描述】:

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

用户可能输入了无效的查询。说“AND”,这是无效的,因为谓词不完整。但是从 Elasticsearch 返回的错误消息非常冗长,并且包含对用户不太友好的术语,例如“所有分片失败”。

有没有一种方法可以为用户提供更有意义的错误消息(比如“坏谓词”)。理想情况下,无需 Elasticsearch 往返即可验证用户搜索字符串,但我会接受更简单的错误消息,但我可以得到它。

【问题讨论】:

  • 这不能回答您的问题,但作为仅供参考,将查询字符串语法直接公开给用户通常是个坏主意。
  • @GregMarzouka 我非常有兴趣了解更多相关信息。有什么可以推荐的资源吗?

标签: elasticsearch nest


【解决方案1】:

Elasticsearch 返回的错误消息很冗长,但对于解析此类错误,Elasticsearch 会抛出 QueryParsingException。如果您仔细检查错误消息,您会在整个错误消息的末尾找到字符串QueryParsingException。这是您感兴趣的异常(及其消息)。例如,当我在搜索请求中将must 拼写为mus2t 时,Elasticsearch 收到一条巨大的错误消息,下面是错误消息的最后一部分.

QueryParsingException[[<index name>] bool query does not support [mus2t]]; }]

当我将 must 拼写为 mus2t 时,我得到了这个。您可以解析并提取此错误消息。

【讨论】:

  • 这对我有用,我得到QueryParsingException[[&lt;index name&gt;] Failed to parse query [AND]]。下一个问题是如何从较大的文本中最好地解析它。我自己可以很容易地编写一个解析器,但是如果没有任何关于错误文本结构的规范,我不知道我是否遗漏了任何微妙的细节。也许其他错误场景的文本格式有很大不同?
  • 起初我将此回复标记为答案,但回想起来,虽然它是一个有用的见解,但它仍然远远低于我真正想要的。例如,如果不是QueryParsingException,我该如何处理“用户友好”错误?如何根据错误响应确定“磁盘已损坏”等严重服务器错误与“格式错误的查询”等更平庸的错误之间的区别?
【解决方案2】:

您可以使用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,但也许会有所帮助。

【讨论】:

  • 有帮助,是的。我确实已经遇到了验证 API,并将其作为一个选项进行了探索。我可以预先验证所有查询,这至少可以明确错误是查询语法错误还是其他原因。但这有点笨拙。正如我所说,理想情况下我可以在没有额外往返的情况下获得验证,但更关键的是,这仍然没有给我一个“简单的错误消息”。
猜你喜欢
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2018-05-09
  • 2021-02-24
相关资源
最近更新 更多