如何只标记Lucene中的某些单词

时间:2014-06-10 16:01:22

标签: java dictionary lucene tokenize

我正在将Lucene用于我的项目,我需要一个自定义分析器。

代码是:

public class MyCommentAnalyzer extends Analyzer {

@Override
    protected TokenStreamComponents createComponents( String fieldName, Reader reader ) {

      Tokenizer source = new StandardTokenizer( Version.LUCENE_48, reader );
      TokenStream filter = new StandardFilter( Version.LUCENE_48, source );

      filter = new StopFilter( Version.LUCENE_48, filter, StandardAnalyzer.STOP_WORDS_SET );

      return new TokenStreamComponents( source, filter );
}

}

我已经建成了,但现在我无法继续。我的需求是过滤器必须只选择某些单词。与使用停用词相比,相反的过程:不要从词列表中删除,而只添加词汇表中的术语。像一个预建的字典。 所以StopFilter没有填满目标。 Lucene提供的过滤器似乎都没有。 我想我需要编写自己的过滤器,但不知道如何。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您可以向StopFilter寻找起点,read the source

大多数StopFilter的源代码都是构建stopset的便捷方法。你可以放心地忽略所有这些(除非你想保留它来构建你的保存集)。

切断所有这些,StopFilter归结为:

public final class StopFilter extends FilteringTokenFilter {

    private final CharArraySet stopWords;
    private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);

    public StopFilter(Version matchVersion, TokenStream in, CharArraySet stopWords) {
        super(matchVersion, in);
        this.stopWords = stopWords;
    }

    @Override
    protected boolean accept() {
        return !stopWords.contains(termAtt.buffer(), 0, termAtt.length());
    }
}

FilteringTokenFilter是一个非常简单的实现类。关键是accept方法。当它被调用当前术语时,如果它返回true,则该术语将被添加到输出流中。如果返回false,则丢弃当前术语。

所以

在这里和那里改变一些名字也不会受到伤害。

StopFilter