如何使用Lucene.Net执行“包含”搜索而不是“以'开头”

时间:2011-03-30 10:15:32

标签: c# search lucene lucene.net

我们使用Lucene.NET在客户网站上实现全文搜索。搜索本身已经有效,但我们现在想要实施修改。

目前所有字词都附加*,这导致Lucene执行我将其归类为StartsWith搜索的内容。

将来我们希望进行搜索,执行类似Contains而不是StartsWith的搜索。

我们使用

  • Lucene.Net 2.9.2.2
  • StandardAnalyzer
  • 默认QueryParser

样品:

(Title:Orch*)匹配:Orchestra

但是:

(Title:rch*)不匹配:Orchestra

我们希望第一个和第二个匹配Orchestra

基本上我想要与此问题中提到的完全相反,我不确定为什么这个人Lucene默认执行了Contains而不是StartsWith
Why is this Lucene query a "contains" instead of a "startsWith"?

我们怎样才能实现这一目标? 我觉得它与分析仪有关,但我不确定。

2 个答案:

答案 0 :(得分:20)

首先,我假设您正在使用StandardAnalyzer或类似的东西。您链接的问题无法理解您搜索的条款,并且他的案例a*将匹配“Fleet Africa”,因为它被标记为“fleet”和“africa”。

您需要致电QueryParser.SetAllowLeadingWildcard(true)才能撰写field:*value*等问题。你实际上是在改变传递给QueryParser的字符串吗?

您可以像往常一样解析查询,然后实现一个QueryVisitor,将所有TermQuery重写为WildcardQuery。这样你仍然支持短语搜索。

我认为将查询重写为前缀或通配符查询没有好处。兽人,胸部和管弦乐队之间的共享很少,但两个词都会匹配。相反,请使用支持词干分析,同义词的分析器与客户联系,并提供拼写纠正功能以修复简单的搜索错误。

答案 1 :(得分:2)

@Simon Svensson可能给出了更好的答案(即你不需要这个),但如果你这样做,你应该使用Shingle Filter

请注意,这会使你的索引大大增加,因为你不会只存储“orchestra”,而是存储“orc”,“rch”,“che”,“hes”...但只是有一个简单的术语查询领先的通配符将会非常缓慢。它基本上必须查看语料库中的每个单词。