【发布时间】:2011-08-10 10:45:34
【问题描述】:
我知道 Lucene 广泛支持通配符搜索,而且我知道您可以搜索以下内容:
Stackover*(将返回 Stackoverflow)
也就是说,我的用户对学习查询语法不感兴趣。 Lucene 可以使用开箱即用的分析器执行这种类型的通配符搜索吗?还是应该在每个搜索查询中附加“*”?
【问题讨论】:
标签: search lucene search-engine lucene.net wildcard
我知道 Lucene 广泛支持通配符搜索,而且我知道您可以搜索以下内容:
Stackover*(将返回 Stackoverflow)
也就是说,我的用户对学习查询语法不感兴趣。 Lucene 可以使用开箱即用的分析器执行这种类型的通配符搜索吗?还是应该在每个搜索查询中附加“*”?
【问题讨论】:
标签: search lucene search-engine lucene.net wildcard
用字符串操作来做这件事很难做到正确,特别是因为 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);
}
}
QueryVisitor 基类目前可以在gitlab 找到。
代码最初发布在 blog post 上,现在已失效。博文还是available at archive.org。
如果您正在考虑将每个查询变成通配符,我会问自己以下问题:
【讨论】:
如果我想做类似的事情,我通常会在搜索之前格式化术语,例如
searchTerm = QueryParser.EscapesearchTerm);
if(!searchTerm.EndsWith(" "))
{
searchTerm = string.Format("{0}*", searchTerm);
}
这将转义人们输入的任何特殊字符。 如果该术语没有以空格结尾,则在末尾附加一个 *。 因为 * 本身会导致解析异常。
【讨论】: