2012-04-07 8 views
2

どのように長さに基づいて特定の用語を除外することができますか?たとえば、3文字未満または20文字以上の用語を索引付けしないでください。また、数字で始まる単語も除外します。Lucene Index:特定の用語を除外

ありがとう、

答えて

3

StandardAnalyzerには、設定できるプロパティがあり、既に数字で始まるトークンが削除されていると思います。しかし、より具体的なニーズがある場合は、Analyzerと可能であればTokenFilterにする必要があります。 Luceneの文書とは対照的に、トークン化手順のトップパフォーマンス要求から生じる異常なコードパターンのため、これらのクラスを実装するのは「直接的」ではありません。たとえば、StandardAnalyzerの振る舞いを少しだけ変更する方法はありません。基本クラスの1つから始める必要があります。 StandardAnalyzer,と同じクラスを拡張する場合は、再利用可能なアナライザを作成しています。このアナライザでは、契約を満たすためにさらに注意する必要があります。

したがって、まずアナライザーを既存のフィルターから一緒に投げてみてください。例えば、LuceneコアにはLengthFilterがあります。それが失敗した場合は、独自のフィルタを実装してアナライザに組み込みます。

public class MyFilter extends FilteringTokenFilter 
{ 
    private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); 

    public MyFilter(TokenStream in) { super(false, in); } 

    protected boolean accept() { 
    final int len = termAtt.length(); 
    final int d = termAtt.charAt(0) - '0': 
    return len >= 3 && len <= 20 && (d < 0 || d > 9); 
    } 
} 

public final class MyAnalyzer extends ReusableAnalyzerBase 
{ 
    @Override protected TokenStreamComponents createComponents(
     String fieldName, Reader reader) 
    { 
    final Tokenizer source = new LowerCaseTokenizer(Version.LUCENE_35, reader); 
    return new TokenStreamComponents(source, new MyFilter(source)); 
    } 
} 
:これは、フィルタとアナライザの両方を実装する際のスタートとしてあなたを助けるかもしれない

関連する問題