如何在我的Lucene应用程序中使用ASCIIFoldingFilter?

我有一个标准的Lucene应用程序,可以从索引中搜索。 我的索引包含很多法语术语,我想使用ASCIIFoldingFilter。

我做了很多搜索,我不知道如何使用它。 构造函数接受一个TokenStream对象,当你发送一个字段时,我是否在分析器上调用检索TokenStream的方法? 那我该怎么办? 有人能指出我正在使用TokenFilter的例子吗? 谢谢。

令牌filter – 比如ASCIIFoldingFilter – 在它们的基础上是TokenStream,因此它们是Analyzer主要通过使用以下方法返回的东西:

public abstract TokenStream tokenStream(String fieldName, Reader reader); 

正如您所注意到的,filter将TokenStream作为输入。 它们就像包装器一样,或者更准确地说,就像装饰器一样。 这意味着它们增强了包含的TokenStream的行为,执行它们的操作和包含输入的操作。

你可以在这里找到解释。 它不直接引用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的子类。

还要记住,您必须在索引和搜索中使用相同的自定义分析器,否则您的查询可能会得到错误的结果。

多年来, 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); } }