Проверка строки запроса Elasticsearch на стороне клиента

У меня есть приложение, которое использует NEST (клиент Elasticsearch .NET) для связи с кластером Elasticsearch. Интеграция позволяет пользователю указать входные данные для части запроса "query_string".

Пользователь может ввести недопустимый запрос. Скажите «И», что недопустимо, потому что предикат неполный. Но сообщение об ошибке, которое приходит от Elasticsearch, чрезвычайно многословно и содержит терминологию, которая не очень удобна для пользователя, например, «сбой всех осколков».

Есть ли способ предложить пользователю более осмысленное сообщение об ошибке (скажем, "плохой предикат"). В идеале строка поиска пользователей должна проверяться без двустороннего обхода Elasticsearch, но я соглашусь на более простое сообщение об ошибке, однако я могу его получить.


person Snixtor    schedule 06.05.2015    source источник
comment
Это не отвечает на ваш вопрос, но, к вашему сведению, обычно плохая идея предоставлять синтаксис строки запроса непосредственно пользователям.   -  person Greg Marzouka    schedule 07.05.2015
comment
@GregMarzouka Мне очень интересно узнать об этом больше. Любые ресурсы, которые вы можете предложить?   -  person Snixtor    schedule 07.05.2015


Ответы (2)


Сообщение об ошибке, возвращаемое Elasticsearch, является подробным, но для анализа подобных ошибок Elasticsearch выдает ошибку QueryParsingException. Если вы внимательно изучите сообщение об ошибке, вы обнаружите строку QueryParsingException ближе к концу всего сообщения об ошибке. Это исключение (и его сообщение), которое вас интересует. Например, когда я написал must как mus2t в поисковом запросе, я получаю огромное сообщение об ошибке от Elasticsearch, а ниже — последняя часть сообщения об ошибке.

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

Я получил это, когда написал must как mus2t. Вы можете проанализировать и извлечь это сообщение об ошибке.

person bittusarkar    schedule 06.05.2015
comment
Это работает для меня, я получаю QueryParsingException[[<index name>] Failed to parse query [AND]]. Однако следующая проблема заключается в том, как лучше всего разобрать это из большого текста. Я мог бы достаточно легко запрограммировать синтаксический анализатор самостоятельно, но без какого-либо уточнения структуры текста ошибки я не узнаю, не упустил ли я каких-либо тонких деталей. Может быть, другие сценарии ошибок имеют другой формат текста? - person Snixtor; 07.05.2015
comment
Сначала я пометил этот ответ как ответ, но, оглядываясь назад, хотя это и полезная информация, он все же не соответствует тому, что я действительно ищу. Например, если это не QueryParsingException, как мне получить удобную для пользователя ошибку? Как определить на основе ответа об ошибке разницу между критической ошибкой сервера, такой как повреждение диска, и чем-то гораздо более посредственным, например, плохо отформатированным запросом? - person Snixtor; 07.05.2015

Вы можете использовать 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, но, возможно, это будет полезно.

person Rob    schedule 09.05.2015
comment
Полезно, да. Я уже сталкивался с API проверки и исследовал его как вариант. Я мог предварительно проверить все запросы, и это, по крайней мере, прояснило бы, была ли ошибка ошибкой синтаксиса запроса или чем-то еще. Но это немного неуклюже. Как я уже сказал, в идеале я могу получить валидацию без дополнительной обратной связи, но, что более важно, это по-прежнему не дает мне простого сообщения об ошибке. - person Snixtor; 12.05.2015