2008-10-21 125 views
2

問題是有一個數據庫有大約20k個客戶記錄,我想盡力避免重複輸入。數據庫是Microsoft SQL Server 2005,維護該數據庫的應用程序是Microsoft Dynamics/SL。我正在創建一個與該數據庫交互的ASP.NET web服務。我的服務可以將客戶記錄插入數據庫,從中讀取記錄或修改這些記錄。無論是在我的web服務中,還是通過MS Dynamics或Sql Server中,我想在用戶確認新記錄添加之前列出可能的匹配項。智能數據庫搜索

所以用戶會提交一條記錄,如果它看起來是唯一的,記錄會保存並返回一個新的ID。如果有可能的重複,用戶可以重新提交確認信息,說:「是的,我看到可能的重複,這是一個新的記錄,我想提交它」。

這很容易,如果它只是一個標點符號或空間事物(例如,如果您輸入「Company,Inc.」並且數據庫中存在「Company Inc」,但是如果存在輕微更改「公司公司」而不是「公司公司」,或者如果有一個胖的手指拼寫錯誤,例如「Cmpany,Inc.」,甚至有可能返回列表中的記錄嗎?如果這絕對不可能,我會如果由於重複而需要合併記錄,它只會導致更多的工作。

回答

5

其中algorithm最適合您的具體細節很大程度上取決於您的域,因此我建議您嘗試一些不同的域 - 您甚至可能需要組合幾個才能獲得最佳結果。縮寫,特別是特定領域的縮寫,可能需要進行預處理或標準化。

對於名稱,您可能最好使用phonetic algorithm--考慮到發音。這些將史密斯和施密特打分得很近,因爲他們很容易混淆這個詞。 Double Metaphone是一個很好的首選。

對於胖指法,你可能會更好用一個edit distance算法 - 這給了2個單詞之間的「差異」。這些將Smith和Smoth關在一起 - 儘管2可能會在語音搜索中滑行。

T-SQL有SOUNDEX和DIFFERENCE - 但它們很差。 A Levenshtein變體是正則選擇,但還有其他很好的選擇 - 如果找不到適當的許可實現,則其中大部分都很容易實現,在C#中實現

所有這些將比使用C#編寫/使用T-SQL要容易得多(儘管我確實發現double metaphone in a horrendous abuse of T-SQL可以在SQL中工作)。

雖然這example is in Access(我從來沒有真正看過代碼,或者使用過實現),但是包含的表示提供了一個相當好的想法,你可能最終需要做什麼。代碼可能值得一看,也許是VBA的一個端口。

+0

我實際上是成功地將SoundEx用作應用程序的快速集成。但您提供的許多說明和鏈接都非常有幫助。 – stephenbayer 2008-10-28 18:54:24

0

你可以嘗試使用全文以自由文本(或FREETEXTTABLE)的搜索功能,試圖找到可能的匹配。

1

如果可以將Lucene.NET集成到您的解決方案中,您應該定義試用。

+0

我秒這... SQL全文搜索幾乎沒用。 – 2008-10-21 19:21:25