如何使用Lucene.Net执行“包含”搜索而不是“以’开头”
我们使用Lucene.NET在客户网站上实现全文搜索。 搜索本身已经有效但我们现在想要实现修改。
目前所有术语都附加了一个*
,这导致Lucene执行我将其归类为StartsWith
搜索的内容。
在未来,我们希望有一个搜索执行像Contains
而不是StartsWith
。
我们用
样品:
(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”…但只是使用前导通配符进行简单的术语查询将会非常缓慢。 它基本上必须查看语料库中的每个单词。
上述就是C#学习教程:如何使用Lucene.Net执行“包含”搜索而不是“以’开头”分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1273225.html