我需要关闭EnglishAnalyzer或其他类似分析器的词干(例如,ItalianAnalyzer等).我正在使用Lucene 3.6.2,我发现只能指定一组不应词干的单词使用此构造函数:
EnglishAnalyzer documentation – stemExclusionSet
我能怎么做?
解决方法:
通常,当您使用特定于语言的分析时,这是因为您想要词干分析.如果您不想词干分析,StandardAnalyzer是一种非常有效的非语言特定的分析器.
但是,在语言分析器中还有其他一些不错的小细节,因此,如果您真的只需要消除分析器中的词干,请抓住分析器的源,并创建自己的分析器,以覆盖TokenStreamComponents方法,然后删除词干过滤器以及相关的组件(通常会找到一个SetKeywordMarkerFilter,可以将其删除,因为它仅用于防止词干对选定标记的影响),例如:
final CharArraySet defaultStopwords = new ItalianAnalyzer(Version.LUCENE_47).getStopWordSet();
final CharArraySet defaultArticles = CharArraySet.unmodifiableSet(
new CharArraySet(Version.LUCENE_CURRENT,
Arrays.asList(
"c", "l", "all", "dall", "dell", "nell", "sull", "coll", "pell",
"gl", "agl", "dagl", "degl", "negl", "sugl", "un", "m", "t", "s", "v", "d"
), true));
Analyzer customItalianAnalyzer = new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
final Tokenizer source = new StandardTokenizer(Version.LUCENE_47, reader);
TokenStream result = new StandardFilter(Version.LUCENE_47, source);
result = new ElisionFilter(result, defaultArticles);
result = new LowerCaseFilter(Version.LUCENE_47, result);
result = new StopFilter(Version.LUCENE_47, result, defaultStopwords);
return new TokenStreamComponents(source, result);
}
};
注意,我在这里重现了停用词和省略号集的定义.我还删除了版本检查,因为在您的自定义用法中,您可以指定一个版本,而不是在if语句中处理它(假设此处您使用的是3.2之后的版本).
另一种选择是只复制ItalianAnalyzer的全部内容,但我认为这样作一次,并粗略地理解了分词器/过滤器链是健康的做法,因此您可以对自己真正想要的内容做出明智的决定您的分析仪要做.