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

Pic*_*les 3 java lucene

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

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

小智 10

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

public abstract TokenStream tokenStream(String fieldName, Reader reader);
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,过滤器将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;
  }
  // ...
}
Run Code Online (Sandbox Code Playgroud)

无论是TokenFilter和标记生成器是子类的TokenStream.

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


Fey*_*yaz 5

Analyzer多年来,抽象类的结构似乎已经发生了变化。该方法在当前版本 (v4.9.0) 中tokenStream设置为。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);
    }
}
Run Code Online (Sandbox Code Playgroud)