我正在寻找如何在ApacheLucene8.x中搜索标识符、产品代码或电话号码的一般建议。(如ISBN,例如978-3-86680-192-9
)。如果有人输入9783
、978 3
或978-3
,则会出现978-3-86680-192-9
。如果标识符使用字母、空格数字、标点符号(例如:TS 123
,123.abc
。我该怎么做?
我想我可以用一个自定义的分析器来解决这个问题,它可以删除所有的标点符号和空格,但是结果是好坏参半的:
public class IdentifierAnalyzer extends Analyzer {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer tokenizer = new KeywordTokenizer();
TokenStream tokenStream = new LowerCaseFilter(tokenizer);
tokenStream = new PatternReplaceFilter(tokenStream, Pattern.compile("[^0-9a-z]"), "", true);
tokenStream = new TrimFilter(tokenStream);
return new TokenStreamComponents(tokenizer, tokenStream);
}
@Override
protected TokenStream normalize(String fieldName, TokenStream in) {
TokenStream tokenStream = new LowerCaseFilter(in);
tokenStream = new PatternReplaceFilter(tokenStream, Pattern.compile("[^0-9a-z]"), "", true);
tokenStream = new TrimFilter(tokenStream);
return tokenStream;
}
}
因此,当我用TS1*
执行PrefixQuery
时,虽然我得到了想要的结果,但TS 1*
(带空格)并没有产生令人满意的结果。myField:TS myField:1*
。WordDelimiterGraphFilter
看起来很有趣,但我不知道在这里应用它。
1条答案
按热度按时间hyrbngr71#
这不是一个全面的答案--但是我同意
WordDelimiterGraphFilter
可能对这种类型的数据有帮助。下面是我的自定义分析器,使用
WordDelimiterGraphFilter
:它使用
WordDelimiterGraphFilterFactory
辅助对象以及参数Map来控制要应用的设置。您可以在
WordDelimiterGraphFilterFactory
JavaDoc中查看可用设置的完整列表。您可能需要尝试设置/取消设置不同的设置。下面是一个用于以下3个输入值的测试索引生成器:
第一个
这将创建以下标记:
为了查询上面的索引数据,我使用了以下代码:
这使用了以下搜索词--我将所有这些词都传递给了经典的查询解析器(当然,您也可以通过API使用更复杂的查询类型):
第一个查询没有找到任何匹配的文档:
这并不奇怪,因为这是一个不完整的标记,没有通配符。第二个查询(添加了通配符)如预期的那样找到了一个文档。
我测试的最后一个查询
TS 1*
找到了三个匹配项--但是我们想要的那个具有最佳匹配分数: