2011-01-08 20 views
0

我希望你會發現這個有趣的! C#是解決方案或T-SQL的首選語言。查找「類似的」零件號

考慮以下幾項:

項目1:NJ2-12GM50-WO-V13

項目2:NJ2-12GM50-禾V13

你可以猜測,個別輸入項目1複製和粘貼,並且輸入項目2的個人只使用'o',他可以找到最接近的英文字符。

當有人進入像NJ2-12GM50-禾V13新的零件數量,我們想建議給他們,他們可能意味着NJ2-12GM50-WO-V13。

爲了做到這一點,我們希望能夠回到存儲爲VARCHAR他們simplist小寫字母的所有字符轉換。我對將ASCII字符246(ö)轉換爲ASCII字符111(o)的解決方案感興趣。

的想法是,如果我們把含有partnumbers的所有轉換版本的查詢欄,我們可以輕鬆地將它們匹配的鍵盤輸入。

當然,我可以做一個解釋這樣做的,但我不知道是否有一個更聰明的方法。

謝謝!

+0

正如下面提到的,你應該在多大程度上考慮過用戶被允許去。一個簡單的e與é是一回事。但「接近」的數字是另一回事。作爲一個興趣點,拼寫檢查器(當然這種類型的事情爲生)使用SOUNDEX(或其大哥哥,雙重metaphone)。但是,這是越來越嚴重;) – IamIC 2011-01-09 05:46:42

回答

2

可能是你最好的選擇是實現一個函數在C#或T-SQL來計算Levenshtein distance兩個部分數字之間。

+0

這是不是矯枉過正?當然,一個簡單的「COLLATE」會特別在SQL – gbn 2011-01-08 10:14:38

+0

@gbn - 也許。取決於差異的類型。是的,如果唯一的區別是「o」與「ö」,那麼collat​​e將會假定拉丁語言,並假定系統在collat​​e'd結果中找到匹配,並且假設沒有其他差異存在,例如缺少字符。 – Thomas 2011-01-08 23:10:25

+0

這非常有幫助,我很欣賞這個建議。我沒有提到我們有11,000,000多行的零件號。我們最終做的是將每個零件編號「標記化」(缺少更好的單詞)成4個字符序列......所以ROCKY是'搖滾'和'ocky'。我們將所有可能的4個字符序列放入一個「Tokens」表中,並創建了一個名爲ItemsTokens的多對多表,它在兩個ID上都有一個複合鍵。觸發器將項目標記化。這給了我們太多的結果,但FAST。然後我們在初始結果上使用Levenshtein來拋出不夠近的匹配。 – 2011-01-13 17:50:27

1

我不能添加爲出於某種原因發表評論,但你可以考慮,而不是(或和),「常用搜索」映射的匹配。這樣的系統在一般情況下可能是有用的(即「紅衣架 - > AB-999X」等),並可能爲你解決這個問題。無論如何,值得考慮。

2

使用COLLATE子句要挾字符串大小寫和不區分重音

IF 'NJ2-12GM50-Wö-V13' COLLATE Latin1_General_CI_AI 
     = 
    'NJ2-12GM50-Wo-V13' COLLATE Latin1_General_CI_AI 
     PRINT 'matches' 
ELSE 
     PRINT 'no match 

所以,你可以用它的東西喜歡用不同的COLLATE你可以驗證用戶輸入

SELECT 
    PartNo AS DidYouMeanThis, 
    @Input AS WhenYouEnteredThis 
FROM 
    MyPartNumbers 
WHERE 
    PartNo COLLATE Latin1_General_CI_AI = @Input COLLATE Latin1_General_CI_AI 

然後確保寫入精確匹配...

IF NOT EXISTS (SLECT * FROM MyPartNumbers 
      WHERE PartNo COLLATE Latin1_General_BIN = @Input Latin1_General_BIN) 
    RAISERROR ('Oi! I asked DidYouMeanThis', 16, 1) 
ELSE 
    INSERT ...