如何使用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
为什么这个Lucene查询是“包含”而不是“startsWith”?

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

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

您需要调用QueryParser.SetAllowLeadingWildcard(true)才能编写如field:*value*类的查询。 你实际上是在改变传递给QueryParser的字符串吗?

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

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

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

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