我正在使用 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
在处理来自用户的查询时,防止 ParseExceptions 的最佳方法是什么?在我看来,最有用的搜索界面是始终执行查询的界面,即使它可能是错误的查询。
似乎有一些可能的互补策略:
- 在将查询发送到 QueryProcessor 之前“清理”查询
- 优雅地处理异常
- 向用户显示智能错误消息
- 也许执行一个更简单的查询,留下错误的位
对于如何执行这些策略,我真的没有什么好主意。有没有其他人解决过这个问题?有没有我不知道的“简单”或“优雅”解析器?