gpt4 book ai didi

java - Lucene 查询解析器使用过滤器进行通配符查询

转载 作者:太空宇宙 更新时间:2023-11-04 06:11:40 25 4
gpt4 key购买 nike

我的问题是如何使用 Lucene 解析通配符查询,查询项通过 TokenFilter 传递。

我正在使用带有多个文件管理器的自定义Analyzer(例如ASCIIFoldingFilter,但这只是一个示例)。我的问题是,每当 Lucene 的 QueryParser 检测到其中一个子查询是 WildcardQuery 时,它就会按照设计 [1] 忽略 Analyzer

这意味着 über 的查询已被正确过滤,

über -> uber

但是对 über*(带有通配符)的查询根本不通过过滤器:

über* -> über*

显然,这意味着 - 由于索引端所有标记都被过滤 - 任何包含 ü 的查询都不能有匹配项...

问:如何强制 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);

最佳答案

好的,我找到了一个解决方案:我扩展 QueryParser 来覆盖 #getWildcardQuery (String, String)。这样我就可以在检测到通配符查询之后和创建它之前拦截并更改该术语:

@Override
protected Query getWildcardQuery (String field, String termStr) throws ParseException
{
String term = termStr;
TokenStream stream = null;
try
{
// we want only a single token and we don't want to lose special characters
stream = new KeywordTokenizer (new StringReader (term));

stream = new LowerCaseFilter (Version.LUCENE_45, stream);
stream = new ASCIIFoldingFilter (stream);

CharTermAttribute charTermAttribute = stream.addAttribute (CharTermAttribute.class);

stream.reset ();
while (stream.incrementToken ())
{
term = charTermAttribute.toString ();
}
}
catch (IOException e)
{
LOGGER.debug ("Failed to filter search query token {}", term, e);
}
finally
{
IOUtils.closeQuietly (stream);
}
return super.getWildcardQuery (field, term);
}

该解决方案基于类似的问题:

Using a Combination of Wildcards and Stemming

How to get a Token from a Lucene TokenStream?

注意:在我的代码中,将所有过滤器保留在一个位置实际上有点复杂......

不过,我仍然觉得应该有更好的解决方案。

关于java - Lucene 查询解析器使用过滤器进行通配符查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28650774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com