我正在将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提供的过滤器似乎都没有。 我想我需要编写自己的过滤器,但不知道如何。
有什么建议吗?
答案 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