Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 如何在Lucene中执行通配符搜索_Search_Lucene_Search Engine_Lucene.net_Wildcard - Fatal编程技术网

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

Search 如何在Lucene中执行通配符搜索,search,lucene,search-engine,lucene.net,wildcard,Search,Lucene,Search Engine,Lucene.net,Wildcard,我知道Lucene广泛支持通配符搜索,我知道您可以搜索以下内容: Stackover*(将返回Stackoverflow) 也就是说,我的用户对学习查询语法不感兴趣。Lucene可以使用现成的分析器执行这种类型的通配符搜索吗?或者我应该在每个搜索查询中添加“*”吗?如果我想做类似的事情,我通常会在搜索前设置术语的格式,例如 searchTerm = QueryParser.EscapesearchTerm); if(!searchTerm.EndsWith(" ")) { searchT

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

Stackover*(将返回Stackoverflow


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

如果我想做类似的事情,我通常会在搜索前设置术语的格式,例如

searchTerm = QueryParser.EscapesearchTerm);
if(!searchTerm.EndsWith(" "))
{
    searchTerm = string.Format("{0}*", searchTerm);
}
这将逃脱人们所赋予的任何特殊角色。 如果这个词没有以空格结尾,在结尾加上一个*。
因为*本身会导致解析异常。

使用字符串操作进行此操作很难正确,特别是因为QueryParser支持boosting、短语等

您可以使用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);
    }
}
QueryVisitor基类当前可在中找到


该代码最初发布在一个网站上,现在已经失效。这篇博文仍然是。

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

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

  • 对于大量记录,LUCENE通配符搜索仍比SQL Server快。当前url: