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

时间:2015-05-06 08:19:40

标签: elasticsearch nest

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

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

有没有办法可以为用户提供更有意义的错误信息(例如 - "坏谓词")。理想情况下,用户搜索字符串将在没有Elasticsearch往返的情况下进行验证,但我会解决一个更简单的错误消息,但我可以得到它。

2 个答案:

答案 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,但也许它会有所帮助。