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

我正在将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 ); } 

}

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

有什么建议吗?

你应该以StopFilter作为起点,所以请阅读源代码 !

StopFilter的大部分内容都是StopFilter的所有便捷方法。 你可以放心地忽略所有这些(除非你想保留它来构建你的保持集)。

切断所有这些, 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更改的StopFilter是删除单个字符,使accept与当前所做的相反的返回。 在这里和那里改变一些名字也不会受到伤害。

 public final class KeepOnlyFilter extends FilteringTokenFilter { private final CharArraySet keepWords; private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); public KeepOnlyFilter(Version matchVersion, TokenStream in, CharArraySet keepWords) { super(matchVersion, in); this.keepWords = keepWords; } @Override protected boolean accept() { return keepWords.contains(termAtt.buffer(), 0, termAtt.length()); } }