我需要关闭EnglishAnalyzer或其他类似分析仪(例如ItalianAnalyzer,ecc ..)的词干。我正在使用Lucene 3.6.2并且我看到只能指定一组使用此构造函数不应该阻止的单词: EnglishAnalyzer documentation - stemExclusionSet
我该怎么办?
答案 0 :(得分:4)
通常当您使用特定于语言的分析时,这是因为您想要词干。 StandardAnalyzer
是一个非常有效的非语言专用分析器,如果你不想干预。
然而,还有其他一些很好的小细节可以在语言分析器中处理,所以如果你真的需要消除分析器中的词干分析器,请抓住分析器的来源,并创建自己的分析器来覆盖{{ 1}}方法,并删除词干过滤器和相关组件(您通常会找到一个可以删除的TokenStreamComponents
,因为它仅用于防止在选定标记上出现词干),例如:
SetKeywordMarkerFilter
注意,我在这里复制了禁用词和椭圆集定义。我还删除了版本检查,因为在您的自定义用法中,您可以指定版本而不是在if语句中处理它(假设您在3.2之后使用的是版本)。
另一种选择是复制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);
}
};
的全部内容,但我认为像这样给它一次性并且粗略地理解标记器/过滤器链是健康的,所以你可以制作关于你真正希望分析仪做什么的明智决定。