4

に を追加しようとしCharFilterていStandardAnalyzerます。私の意図は、インデックスを作成するすべてのテキストから句読点を削除することです。たとえば、PrefixQuery "pf" を "PF Chang's" に一致させたり、"zaras" を "Zara's" に一致させたりします。

ここでの攻撃の最も簡単な計画は、分析の前にすべての句読点を除外することです。Analyzerパッケージのドキュメントによると、CharFilter.

しかし、実際にCharFilterをアナライザーに挿入するのはほとんど不可能に思えます!

Analyzer.initReaderの JavaDoc には、「CharFilter を挿入する場合はこれをオーバーライドしてください」と書かれています。

コードが Analyzer を拡張する場合、initReader を拡張できますが、抽象的なcreateComponentsをベースの StandardAnalyzer に委任することはできません。これは保護されているためです。tokenStreamは最終的なものであるため、ベース アナライザーにデリゲートできません。したがって、Analyzer のサブクラスは、別の Analyzer を使用して汚れた作業を行うことはできないようです。

AnalyzerWrapper希望にぴったりのクラスがある!基本アナライザーを提供して、必要な部分のみをオーバーライドできます。ただし… initReaderはベース アナライザーに委譲するために既にオーバーライドされており、このオーバーライドは「最終」です。残念!

パッケージに自分を入れて、保護されたメソッドにアクセスできると思いますがAnalyzer、これは、実際に使用する必要があるパブリック API をバイパスするためのうんざりするほどハックな方法のようです。org.apache.lucene.analyzerscreateComponents

ここで何かギラギラしていませんか?StandardAnalyzerカスタム を使用するように を修正するにはどうすればよいCharFilterですか?

4

1 に答える 1

5

その意図はAnalyzer、 ではなくをオーバーライドすることですStandardAnalyzer。考え方としては、Analyzer の実装をサブクラス化してはいけません (ここでいくつかの議論があります)。ただし、Analyzer の実装は非常に簡単で、StandardAnalyzer と同じトークナイザー/フィルター チェーンを実装する Analyzer に CharFilter を追加すると、次のようになります。

public final class MyAnalyzer {
    @Override
    protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
        final StandardTokenizer src = new StandardTokenizer(matchVersion, reader);
        TokenStream tok = new StandardFilter(matchVersion, src);
        tok = new LowerCaseFilter(matchVersion, tok);
        tok = new StopFilter(matchVersion, tok, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
        return new TokenStreamComponents(src, tok);
    }

    @Override
    protected Reader initReader(String fieldName, Reader reader) {
        //return your CharFilter-wrapped reader here
    }
}
于 2013-06-12T17:42:13.657 に答える