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

Java 如何在Lucene应用程序中使用ASCIIFoldingFilter?,java,lucene,Java,Lucene,我有一个标准的Lucene应用程序,可以从索引中进行搜索。我的索引包含很多法语术语,我想使用ASCIIFoldingFilter 我已经做了很多搜索,我不知道如何使用它。构造函数接受一个TokenStream对象,当您向分析器发送一个字段时,我是否调用该分析器上检索TokenStream的方法?那我该怎么办?有人能给我举一个使用TokenFilter的例子吗?谢谢。令牌过滤器(与ASCIIFoldingFilter一样)以令牌流为基础,因此分析仪主要通过以下方法返回: public abstra

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


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

令牌过滤器(与ASCIIFoldingFilter一样)以令牌流为基础,因此分析仪主要通过以下方法返回:

public abstract TokenStream tokenStream(String fieldName, Reader reader);
正如您所注意到的,过滤器将令牌流作为输入。它们的行为就像包装器,或者更准确地说,就像它们的输入。这意味着它们增强了包含的令牌流的行为,同时执行它们的操作和包含的输入的操作

你可以找到一个解释。它不是直接指ASCIIFoldingFilter,但同样的原理也适用。基本上,您可以创建一个自定义分析器,其中包含以下内容(简化示例):

TokenFilter和Tokenizer都是的子类


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

分析器的抽象类的结构似乎多年来有所改变。在当前版本(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);
    }
}

StandartTokenizer现在被弃用IIRC,现在的方法是什么?
// 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);
    }
}