我知道Lucene对通配符搜索有广泛的支持,我知道你可以搜索以下内容:
Stackover * (将返回 Stackoverflow )
也就是说,我的用户对学习查询语法不感兴趣。 Lucene可以使用开箱即用的分析器执行这种类型的通配符搜索吗?或者我应该在每个搜索查询中添加“*”吗?
答案 0 :(得分:3)
使用字符串操作执行此操作非常棘手,尤其是因为QueryParser支持提升,短语等。
您可以使用QueryVisitor将TermQuery重写为PrefixQuery。
public class PrefixRewriter : QueryVisitor {
protected override Query VisitTermQuery(TermQuery query) {
var term = query.GetTerm();
var newQuery = new PrefixQuery(term);
return CopyBoost(query, newQuery);
}
}
可以在A QueryVisitor for Lucene找到QueryVisitor类。
几年后更新:
博客文章很久以前就是404,但是源代码仍然存在!它现在可以在github找到。
答案 1 :(得分:3)
如果您正在考虑将每个查询转换为通配符,我会问自己这些问题:
答案 2 :(得分:0)
如果我想做类似的事情,我通常会在搜索之前格式化这个术语,例如
searchTerm = QueryParser.EscapesearchTerm);
if(!searchTerm.EndsWith(" "))
{
searchTerm = string.Format("{0}*", searchTerm);
}
将逃脱人们放入的任何特殊字符。 如果术语不以空格结尾,则在末尾添加*。 因为*本身会导致解析异常。