在Lucene转身

时间:2014-05-02 23:26:57

标签: java lucene stemming

我需要关闭EnglishAnalyzer或其他类似分析仪(例如ItalianAnalyzer,ecc ..)的词干。我正在使用Lucene 3.6.2并且我看到只能指定一组使用此构造函数不应该阻止的单词: EnglishAnalyzer documentation - stemExclusionSet

我该怎么办?

1 个答案:

答案 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); } }; 的全部内容,但我认为像这样给它一次性并且粗略地理解标记器/过滤器链是健康的,所以你可以制作关于你真正希望分析仪做什么的明智决定。