如何在Lucene中执行通配符搜索

时间:2011-04-21 16:10:13

标签: search lucene search-engine lucene.net wildcard

我知道Lucene对通配符搜索有广泛的支持,我知道你可以搜索以下内容:

Stackover * (将返回 Stackoverflow

也就是说,我的用户对学习查询语法不感兴趣。 Lucene可以使用开箱即用的分析器执行这种类型的通配符搜索吗?或者我应该在每个搜索查询中添加“*”吗?

3 个答案:

答案 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)

如果您正在考虑将每个查询转换为通配符,我会问自己这些问题:

  1. Lucene是这项工作的最佳工具吗?默认情况下,通配符会重写为常量分数查询,这意味着您完全丢弃相关性排名,不再“搜索”而是“匹配”。也许对于您的应用程序,搜索引擎库不是最佳解决方案,而另一个工具(例如数据库)会更好。
  2. 如果#1的答案仍为“是”,那么我建议您查看您要解决的确切相关性问题。例如,如果您希望查询匹配复合词或词干词,则可以改为将解析器或词干分析器添加到分析链中。您还可以考虑使用n-gram索引技术作为另一种选择。

答案 2 :(得分:0)

如果我想做类似的事情,我通常会在搜索之前格式化这个术语,例如

searchTerm = QueryParser.EscapesearchTerm);
if(!searchTerm.EndsWith(" "))
{
    searchTerm = string.Format("{0}*", searchTerm);
}

将逃脱人们放入的任何特殊字符。 如果术语不以空格结尾,则在末尾添加*。 因为*本身会导致解析异常。