2013-07-02 56 views
1

我有一個數據庫表包含代碼領域約40000條記錄,如 FLEFSU25B-25M EMG1090-5SLucene的分析儀子

我需要能夠非常快速地選擇包含特定字符串的所有代碼。例如「109」匹配EMG1090-5S。

我目前的做法是將代碼存儲在Lucene和具有由子Lucene的過濾器 - 如 但是,這並不是非常有效的,如果我只存儲代碼,因爲比Lucene的具有通過所有的令牌搜索。

爲了克服這個問題,我想創建一個新的分析,將每個代碼分成令牌,像這樣的: EMG1090-5S
MG1090-5S
G1090-5S
1090-5S
。 ..

然後找到所有代碼與子字符串109,我可以搜索109 *這是更有效率(我瞭解Lucene存儲令牌字母,就像SQL Server索引)。

這是否有意義? 這種分析儀是否已經存在?我正在使用.Net/C#。

回答

1

一個令牌過濾器來完成這個確實已經存在!看看EdgeNGramTokenFilter。一個Analyzer使用它可能看起來像:

Analyzer analyzer = new Analyzer() { 
@Override 
    protected TokenStreamComponents createComponents(String fieldName, Reader reader) { 
    KeywordTokenizer source = new KeywordTokenizer(reader); 
    LowercaseFilter filter = new LowercaseFilter(source); 
    filter = new EdgeNGramTokenFilter(filter, EdgeNGramTokenFilter.Side.BACK, 2, 50); 
    return new TokenStreamComponents(source, filter); 
    } 
}; 

爲您考慮,WordDelimiterTokenizer也可能被證明對你有用。它有許多配置選項,可以用來分隔標點符號和從字母到數字的轉換等。因此,使用它,您可以從輸入中獲得:「EMG1090-5S」

您可以獲得令牌:

  • EMG
  • 小號

這可能會爲你的CAS工作良好e,但不會特別有助於找到類似的內容:「MG1」