当前位置:  开发笔记 > 编程语言 > 正文

如何让Lucene QueryParser更宽容?

如何解决《如何让LuceneQueryParser更宽容?》经验,为你挑选了2个好方法。

我正在使用Lucene.net,但我正在为.NET和Java版本标记这个问题,因为API是相同的,我希望在这两个平台上都有解决方案.

我相信其他人已经解决了这个问题,但我找不到任何好的讨论或例子.

默认情况下,Lucene对查询语法非常挑剔.例如,我刚刚收到以下错误:

[ParseException: Cannot parse 'hi there!': Encountered "" at line 1, column 9.
Was expecting one of:
    "(" ...
    "*" ...
     ...
     ...
     ...
     ...
    "[" ...
    "{" ...
     ...
    ]
   Lucene.Net.QueryParsers.QueryParser.Parse(String query) +239

处理来自用户的查询时,阻止ParseExceptions的最佳方法是什么?在我看来,最有用的搜索界面是始终执行查询的界面,即使它可能是错误的查询.

似乎有一些可能的,互补的策略:

在将查询发送到QueryProcessor之前"清理"查询

优雅地处理异常

向用户显示智能错误消息

也许执行一个更简单的查询,省去错误的位

关于如何做这些策略,我真的没有什么好主意.还有其他人解决了这个问题吗?有什么"简单"或"优雅"的解析器我不知道吗?



1> ljorquera..:

哟可以让Lucene通过使用类似的东西清理查询来忽略特殊字符

query = QueryParser.Escape(query)

如果您不希望用户在查询中使用高级语法,则可以始终执行此操作.

如果您希望您的用户使用高级语法,但您也希望对错误更加宽容,那么您应该只在ParseException发生后进行清理.



2> Jay Kominek..:

好吧,最简单的方法是给查询的原始形式一个镜头,如果失败了,就回去清理它.

Query safe_query_parser(QueryParser qp, String raw_query)
  throws ParseException
{
  Query q;
  try {
    q = qp.parse(raw_query);
  } catch(ParseException e) {
    q = null;
  }
  if(q==null)
    {
      String cooked;
      // consider changing this "" to " "
      cooked = raw_query.replaceAll("[^\w\s]","");
      q = qp.parse(cooked);
    }
  return q;
}

这为用户查询的原始形式提供了运行的机会,但如果解析失败,我们会删除除字母,数字,空格和下划线之外的所有内容; 然后我们再试一次.我们仍然冒险抛出ParseException,但我们已经大大降低了赔率.

您还可以考虑自己标记用户的查询,将每个标记转换为术语查询,并使用BooleanQuery将它们组合在一起.如果你真的不希望你的用户利用QueryParser的功能,那将是最好的选择.你完全(?)健壮,用户可以通过你的分析器搜索任何有趣的角色

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有