14

我正在使用 Lucene 4.3 对英文推文进行索引,但是我不确定要使用哪个 Analyzer。Lucene StandardAnalyzer 和 EnglishAnalyzer 有什么区别?

我还尝试使用以下文本测试 StandardAnalyzer:“XY&Z Corporation - xyz@example.com”。输出是:[xy] [z] [corporation] [xyz] [example.com],但我认为输出将是:[XY&Z] [Corporation] [xyz@example.com]

难道我做错了什么?

4

1 回答 1

16

看看源头。通常,分析器非常易读。您只需要查看CreateComponents方法即可查看它正在使用的 Tokenizer 和 Filters:

@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    final Tokenizer source = new StandardTokenizer(matchVersion, reader);
    TokenStream result = new StandardFilter(matchVersion, source);
    // prior to this we get the classic behavior, standardfilter does it for us.
    if (matchVersion.onOrAfter(Version.LUCENE_31))
      result = new EnglishPossessiveFilter(matchVersion, result);
    result = new LowerCaseFilter(matchVersion, result);
    result = new StopFilter(matchVersion, result, stopwords);
    if(!stemExclusionSet.isEmpty())
      result = new KeywordMarkerFilter(result, stemExclusionSet);
    result = new PorterStemFilter(result);
    return new TokenStreamComponents(source, result);
 }

而 ,StandardAnalyzer只是StandardTokenizer, StandardFilter, LowercaseFilter, 和StopFilter. EnglishAnalyzer滚入EnglishPossesiveFilter,KeywordMarkerFilterPorterStemFilter.

主要是,EnglishAnalyzer 加入了一些英语词干增强功能,这对于纯英文文本应该很有效。

对于 StandardAnalyzer,我所知道的与英语分析直接相关的唯一假设是默认停用词集,当然,这只是一个默认值,可以更改。StandardAnalyzer 现在实现Unicode Standard Annex #29,它试图提供非特定语言的文本分段。

于 2013-06-10T16:10:19.213 回答