我们使用Lucene.NET在客户网站上实现全文搜索。搜索本身已经有效,但我们现在想要实施修改。
目前所有字词都附加*
,这导致Lucene执行我将其归类为StartsWith
搜索的内容。
将来我们希望进行搜索,执行类似Contains
而不是StartsWith
的搜索。
我们使用
样品:
(Title:Orch*)
匹配:Orchestra
但是:
(Title:rch*)
不匹配:Orchestra
我们希望第一个和第二个匹配Orchestra
。
基本上我想要与此问题中提到的完全相反,我不确定为什么这个人Lucene默认执行了Contains
而不是StartsWith
:
Why is this Lucene query a "contains" instead of a "startsWith"?
我们怎样才能实现这一目标? 我觉得它与分析仪有关,但我不确定。
答案 0 :(得分:20)
首先,我假设您正在使用StandardAnalyzer或类似的东西。您链接的问题无法理解您搜索的条款,并且他的案例a*
将匹配“Fleet Africa”,因为它被标记为“fleet”和“africa”。
您需要致电QueryParser.SetAllowLeadingWildcard(true)
才能撰写field:*value*
等问题。你实际上是在改变传递给QueryParser的字符串吗?
您可以像往常一样解析查询,然后实现一个QueryVisitor,将所有TermQuery
重写为WildcardQuery
。这样你仍然支持短语搜索。
我认为将查询重写为前缀或通配符查询没有好处。兽人,胸部和管弦乐队之间的共享很少,但两个词都会匹配。相反,请使用支持词干分析,同义词的分析器与客户联系,并提供拼写纠正功能以修复简单的搜索错误。
答案 1 :(得分:2)
请注意,这会使你的索引大大增加,因为你不会只存储“orchestra”,而是存储“orc”,“rch”,“che”,“hes”...但只是有一个简单的术语查询领先的通配符将会非常缓慢。它基本上必须查看语料库中的每个单词。