Я использую Lucene.net, но я отмечаю этот вопрос для версий .NET и Java, потому что API одинаков, и я надеюсь, что есть решения на обеих платформах.
Я уверен, что другие люди обращались к этой проблеме, но я не смог найти хороших обсуждений или примеров.
По умолчанию Lucene очень требователен к синтаксису запросов. Например, я только что получил следующую ошибку:
[ParseException: Cannot parse 'hi there!': Encountered "<EOF>" at line 1, column 9.
Was expecting one of:
"(" ...
"*" ...
<QUOTED> ...
<TERM> ...
<PREFIXTERM> ...
<WILDTERM> ...
"[" ...
"{" ...
<NUMBER> ...
]
Lucene.Net.QueryParsers.QueryParser.Parse(String query) +239
Каков наилучший способ предотвращения исключений ParseException при обработке запросов от пользователей? Мне кажется, что наиболее используемый интерфейс поиска - это интерфейс, который всегда выполняет запрос, даже если он может быть неправильным.
Похоже, есть несколько возможных и взаимодополняющих стратегий:
- «Очистить» запрос перед отправкой в QueryProcessor
- Изящно обрабатывать исключения
- Показывать интеллектуальное сообщение об ошибке пользователю
- Возможно, выполнить более простой запрос, исключив ошибочный бит
У меня нет действительно хороших идей о том, как реализовать любую из этих стратегий. Кто-нибудь еще обращался к этой проблеме? Есть ли какие-нибудь "простые" или "изящные" парсеры, о которых я не знаю?