2013-06-24 42 views
3

我正在使用lucene 4.3.0並希望用英文和日文字符標記文檔。如何在lucene中使用兩個標記器(japaneseanalyzer和standardanalyzer)

An example is like "LEICA S2 カタログ (新品)" 
    The StandardAnalyzer "[leica] [s2] [カタログ] [新] [品]" 
    The JapaneseAnalyzer "[leica] [s] [2] [カタログ] [新品]" 

在我的項目的應用程序中,StandardAnalyzer對英文字符比較好, [s2]比[s] [2]更好。日語分析器對日語比較好,例如[新品]到[新] [品]。此外,JapaneseAnalyzer具有將全角字符「2」轉換爲「2」的良好功能。

If I want the tokens to be [leica] [s2] [カタログ] [新品], it means: 
    1) English and numbers are tokenized by StandardAnalyzer. [leica] [s2] 
    2) Japanese are tokenized by JapaneseAnalyzer. [カタログ] [新品] 
    3) fullwidth character are converted to halfwidth by a filter. [s2]=>[s2] 
    how to implement this custom analyzer? 

回答

2

第一件事我會嘗試與傳遞到JapaneseAnalyzer參數,搞亂特別是Tokenizer.Mode(我知道的這些選項的意圖恰恰沒有對日本語言的結構,所以沒有幫助從我) 。


除非是

你需要創建自己的分析這一點。除非你願意編寫自己的Tokenizer,否則最終的結果可能是最好的。創建一個分析器非常簡單,創建一個標記器將意味着定義你自己的語法,這不會那麼簡單。

看看爲JapaneseAnalyzerStandardAnalyzer代碼,尤其是呼叫createComponents,這是所有你需要實現創建自定義分析。

說你來定論StandardTokenizer是你正確的,但除此之外,我們將主要使用日本的過濾器設置,它可能看起來像:

@Override 
protected TokenStreamComponents createComponents(String fieldName, Reader reader) { 
    //For your Tokenizer, you might consider StandardTokenizer, JapaneseTokenizer, or CharTokenizer 
    Tokenizer tokenizer = new StandardTokenizer(version, reader); 
    TokenStream stream = new StandardFilter(version, tokenizer); 
    stream = new JapaneseBaseFormFilter(stream); 
    stream = new LowerCaseFilter(matchVersion, stream); //In JapaneseAnalyzer, a lowercasefilter comes at the end, further proving I don't know Japanese. 
    stream = new JapanesePartOfSpeechStopFilter(true, stream, stoptags); 
    stream = new CJKWidthFilter(stream); //Note this WidthFilter! I believe this does the char width transform you are looking for. 
    stream = new StopFilter(matchVersion, stream, stopwords); 
    stream = new JapaneseKatakanaStemFilter(stream); 
    stream = new PorterStemFilter(stream); //Nothing stopping you using a second stemmer, really. 
    return new TokenStreamComponents(tokenizer, stream); 
} 

這是一個完全隨機的實施,從不明白問題的人,但希望能指出實現更有意義的分析儀的方式。您在該過濾器鏈中應用過濾器的順序非常重要,因此請小心(例如,在英語中,LowerCaseFilter通常應用得比較早,因此Stemmers不必擔心大小寫)。

相關問題