【问题标题】:Using lucene and wildcards at the beginning of a word在单词开头使用 lucene 和通配符
【发布时间】:2013-03-05 13:32:18
【问题描述】:

我在使用 Lucene.NET 2.9.4 时遇到问题。也许有人可以帮助我。

目前当用户输入open这个词时,我会自动将搜索引擎更改为*open* .我已经设置了 QueryParser.SetAllowLeadingWildcard(true);我知道,这可能很贵...

我的文字是:

您可以使用菜单文件/打开来编辑现有文档

当我使用 open*open 作为搜索词时,lucene 会找到文本。 p>

当我使用 *open* lucene 找不到文本。

为什么不呢?前导通配符有什么问题?我想在单词的开头、结尾和中间找到搜索词。

我想搜索打开和...

  • foo bar => 不匹配
  • 打开 foo bar => 匹配
  • testopen foo bar => 匹配
  • testopening foo bar => 匹配

我该怎么做?

【问题讨论】:

  • 我在使用 Lucene 时也遇到过一些意外/不一致的结果,但通常是由于存储和查询分析器不匹配造成的。您确定数据是使用您尝试搜索的分析器提交到 Lucene 的吗?
  • 是的,我确定。我只在我的程序中使用 StandardAnalyzer ...... new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29, this.StopWordFile);

标签: c# lucene wildcard


【解决方案1】:

默认情况下,前导通配符被禁用,但使用 Lucene >=2.1 可以启用此功能。

QueryParser 不支持前导通配符(例如 *ook) 默认。从 Lucene 2.1 开始,它们可以通过调用来启用 QueryParser.setAllowLeadingWildcard(true)。请注意,这可以是 昂贵的操作:它需要扫描令牌列表 完全索引以查找与模式匹配的那些。

见:Lucene FAQ

【讨论】:

  • 请再读一遍我第一篇文章的第三行...你会看到的,我已经知道了!但我不知道为什么前导通配符表示“一个或多个”字符,而结束通配符表示“零个或多个”。
【解决方案2】:

两件事:

1) 我会验证 Luke 给您的结果与您的查询代码相同。

2) “testopening foo bar”是有效还是失败?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多