问题是有一个大约有20k客户记录的数据库,我想尽最大努力避免重复输入.该数据库是Microsoft SQL Server 2005,维护该数据库的应用程序是Microsoft Dynamics / SL.我正在创建一个与该数据库交互的
因此,用户将提交记录,如果它似乎是唯一的,则记录将保存并返回新的ID.如果有可能重复,用户可以重新提交确认说“是的,我看到可能的重复,这是一个新记录,我想提交它”.
如果它只是标点符号或空格符号(例如,如果您输入“Company,Inc.”并且数据库中有“Company Inc”),这很容易,但如果有一些细微的变化,如“公司公司”怎么办? “而不是”公司公司“,或者如果有一个肥胖的手指拼写错误,例如”Cmpany,Inc.“甚至可以在列表中返回这样的记录?如果绝对不可能,我将处理我的问题如果由于重复需要合并记录,它只会导致更多的工作.
algorithm最适合您的细节在很大程度上取决于您的域名,所以我建议尝试一些不同的域名 – 您甚至可能需要合并一些才能获得最佳结果.缩写,尤其是特定领域的缩写,可能也需要进行预处理或标准化.对于名字,你可能最好用phonetic algorithm – 考虑到发音.这些将使史密斯和施密特紧密相连,因为在说这些话时容易混淆. Double Metaphone是一个不错的首选.
对于胖指法,使用edit distance算法可能会更好 – 这会在2个单词之间产生“差异”.这些将史密斯和斯莫斯靠近得分 – 尽管2可能会通过语音搜索.
T-SQL有SOUNDEX和DIFFERENCE – 但它们很差. Levenshtein变体是规范选择,但是还有其他很好的选择 – 如果你找不到合适的许可实现,那么大多数变体在C#中都很容易实现.
所有这些都比C#更容易编码/使用C#(尽管我确实找到了可能在SQL中工作的double metaphone in a horrendous abuse of T-SQL).
虽然这个example is in Access(我从未真正查看过代码,或者使用过实现),但所包含的演示文稿可以很好地了解您最终可能需要做什么.代码可能值得一看,也许是来自VBA的端口.