2017-02-02 108 views
3

我對Lucene的StandardAnalyzer用於特定的索引屬性。 像àéèäöü作爲特殊字符不被索引的預期,我想將這些字符替換:如何擴展Lucene的StandardAnalyzer進行自定義特殊字符處理?

  • A - >一個
  • é - >電子
  • è - >電子
  • A - > AE
  • ö - > OE
  • ü - > UE

什麼是日e擴展org.apache.lucene.analysis.standard.StandardAnalyzer類的最佳方法?

我正在尋找一種標準解析器遍歷所有標記(單詞)的方法,我可以逐字檢索並在那裏做魔法。

感謝您的任何提示。

+0

這將是更容易幫助你,如果你表現出的所有方法,您在'StandardAnalyzer'調用什麼。 (僅供參考,由於班級是最終的,所以不能擴展)。也就是說,它看起來像'StandardAnalyzer'有一個構造函數,它需要一個'Reader'。你可能可以利用這一點,並將其傳遞給一個自定義閱讀器? – CKing

回答

0

你不會延長StandardAnalyzer,因爲分析儀的實現是最終的。分析器實現的原理是createComponents方法,無論如何你都必須重寫,所以無論如何你都不會得到太多的延伸。

相反,您可以複製StandardAnalyzer來源,並修改createComponents方法。對於您要求的內容,我建議添加ASCIIFoldingFilter,它將嘗試將UTF字符(如重音字母)轉換爲ASCII等效字符。所以,你可以創建一個分析是這樣的:

Analyzer analyzer = new Analyzer() { 
    @Override 
    protected TokenStreamComponents createComponents(final String fieldName) { 
    final StandardTokenizer src = new StandardTokenizer(); 
    src.setMaxTokenLength(maxTokenLength); 
    TokenStream tok = new StandardFilter(src); 
    tok = new LowerCaseFilter(tok); 
    tok = new ASCIIFoldingFilter(tok); /*Adding it before the StopFilter would probably be most helpful.*/ 
    tok = new StopFilter(tok, StandardAnalyzer.ENGLISH_STOP_WORDS_SET); 
    return new TokenStreamComponents(src, tok) { 
     @Override 
     protected void setReader(final Reader reader) { 
     src.setMaxTokenLength(StandardAnalyzer.DEFAULT_MAX_TOKEN_LENGTH); 
     super.setReader(reader); 
     } 
    }; 
    } 

    @Override 
    protected TokenStream normalize(String fieldName, TokenStream in) { 
    TokenStream result = new StandardFilter(in); 
    result = new LowerCaseFilter(result); 
    tok = new ASCIIFoldingFilter(tok); 
    return result; 
    } 
}