【发布时间】:2015-04-23 10:02:35
【问题描述】:
我的问题是如何使用 Lucene 解析通配符查询,查询词是通过 TokenFilter 传递的。
我正在使用带有多个文件管理器的自定义 Analyzer(例如 ASCIIFoldingFilter,但这只是一个示例)。我的问题是,每当 Lucene 的 QueryParser 检测到其中一个子查询是 WildcardQuery,它设计 [1] 忽略 Analyzer。
这意味着对 über 的查询被正确过滤,
über -> uber
但是对 über*(带有通配符)的查询根本没有通过过滤器:
über* -> über*
显然,这意味着 - 作为索引端所有标记都被过滤 - 在任何包含 ü...
的查询上都可能有 no 匹配项问:如何强制 Lucene 也过滤通配符查询的查询?我正在寻找一种至少可以稍微重用 Lucene 代码库的方法;-)
注意:作为输入,我收到一个查询字符串,因此不能以编程方式构建查询。 注意:我使用的是 Lucene 4.5.1。
[1]http://www.gossamer-threads.com/lists/lucene/java-user/14224
上下文:
// analyzer applies filters in Analyzer#createComponents (String, Reader)
Analyzer analyzer = new CustomAnalyzer (Version.LUCENE_45);
// I'm using org.apache.lucene.queryparser.classic.MultiFieldQueryParser
QueryParser parser = new MultiFieldQueryParser (Version.LUCENE_45, fields, analyzer);
parser.setAllowLeadingWildcard (true);
parser.setMultiTermRewriteMethod (MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);
// actual parsing of the input query
Query query = parser.parse (input);
【问题讨论】:
-
我不明白分析器如何处理您的查询。它会如何影响它?