我有一个标准的Lucene应用程序,可以从索引中搜索。我的索引包含很多法语术语,我想使用ASCIIFoldingFilter。
我做了很多搜索,我不知道如何使用它。构造函数接受一个TokenStream对象,当你发送一个字段时,我是否在分析器上调用检索TokenStream的方法?那我该怎么办?有人能指出我正在使用TokenFilter的例子吗?感谢。
答案 0 :(得分:10)
令牌过滤器 - 就像ASCIIFoldingFilter一样 - 位于TokenStream的基础上,因此它们是Analyzer主要通过以下方法返回的东西:
public abstract TokenStream tokenStream(String fieldName, Reader reader);
正如您所注意到的,过滤器将TokenStream作为输入。它们像包装一样,或者更准确地说,就像decorators一样。这意味着它们增强了包含的TokenStream的行为,执行它们的操作和包含输入的操作。
您可以找到解释here。它不直接引用ASCIIFoldingFilter,但适用相同的原则。基本上,您可以在其中创建一个包含类似内容的自定义分析器(去掉示例):
public class CustomAnalyzer extends Analyzer {
// other content omitted
// ...
public TokenStream tokenStream(String fieldName, Reader reader) {
TokenStream result = new StandardTokenizer(reader);
result = new StandardFilter(result);
result = new LowerCaseFilter(result);
// etc etc ...
result = new StopFilter(result, yourSetOfStopWords);
result = new ASCIIFoldingFilter(result);
return result;
}
// ...
}
TokenFilter和Tokenizer都是TokenStream的子类。
还要记住,您必须在索引和搜索中使用相同的自定义分析器,否则您的查询可能会得到错误的结果。
答案 1 :(得分:4)
多年来,Analyzer
抽象类的结构似乎已经发生了变化。方法tokenStream
在当前版本(v4.9.0)中设置为final
。以下课程应该做的工作:
// Accent insensitive analyzer
public class AccentInsensitiveAnalyzer extends StopwordAnalyzerBase {
public AccentInsensitiveAnalyzer(Version matchVersion){
super(matchVersion, StandardAnalyzer.STOP_WORDS_SET);
}
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
final Tokenizer source = new StandardTokenizer(matchVersion, reader);
TokenStream tokenStream = source;
tokenStream = new StandardFilter(matchVersion, tokenStream);
tokenStream = new LowerCaseFilter(tokenStream);
tokenStream = new StopFilter(matchVersion, tokenStream, getStopwordSet());
tokenStream = new ASCIIFoldingFilter(tokenStream);
return new TokenStreamComponents(source, tokenStream);
}
}