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