问题是有一个大约有20k客户记录的数据库,我想尽最大努力避免重复输入。该数据库是Microsoft SQL Server 2005,维护该数据库的应用程序是Microsoft Dynamics / SL。我正在创建一个与该数据库交互的ASP.NET Web服务。我的服务可以将客户记录插入数据库,从中读取记录或修改这些记录。无论是在我的Web服务中,还是通过MS Dynamics,还是在Sql Server中,我都希望在用户确认新记录添加之前提供可能的匹配列表。

因此用户将提交记录,如果它似乎是唯一的,记录将保存并返回一个新ID。如果存在可能的重复,则用户可以重新提交确认说“是,我看到可能的重复,这是新记录,我想提交它”。

如果它只是标点符号或空格符号(例如,如果您输入“Company,Inc。”并且数据库中有“Company Inc”,那么这很容易,但是如果有轻微的变化会怎么样?例如“公司公司”而不是“公司公司”或者如果存在脂肪拼写错误拼写,例如“Cmpany,Inc。”,是否甚至可以返回列表中的记录?如果是绝对不可能,我将处理我所拥有的。如果由于重复需要合并记录,它只会导致更多的工作。

有帮助吗?

解决方案

算法的具体细节最适合你的工作在很大程度上取决于你的领域,所以我建议尝试一些不同的 - 你甚至可能需要结合几个来获得最佳结果。缩写,尤其是特定领域的缩写,可能也需要进行预处理或标准化。

对于名字,你可能最好使用语音算法 - 考虑到发音。这些将使史密斯和施密特紧密相连,因为当时,他们很容易混淆。 Double Metaphone 是一个不错的首选。

对于胖指法,使用编辑距离算法可能会更好 - 这给出了“差异”。两个字之间。这些将使史密斯和斯莫斯在一起得分 - 即使2可能会通过语音搜索。

T-SQL有SOUNDEX和 DIFFERENCE - 但它们是非常差。 Levenshtein 变体是规范的选择,但还有其他不错的选择 - 其中大部分相当容易如果你找不到合适的许可实现,那么在C#中实现

所有这些都比C-SQL更容易编码/使用(尽管我找到了可怕的滥用T-SQL的双元电话可能适用于SQL)。

虽然这个示例正在访问(我实际上从未实际查看代码,或使用实现)包含的演示文稿提供了一个相当好的想法,你可能最终需要做什么。代码可能值得一看,也许是来自VBA的端口。

其他提示

查看SQL Server中的 SOUNDEXing 。我相信它会给你你正在寻找的可能比赛的模糊性。

SOUNDEX @ MSDN

SOUNDEX @ Wikipedia

如果可以将 Lucene.NET 集成到您的解决方案中,您应该绝对试用它进行。

您可以尝试使用FreeText(或FreeTextTable)函数进行全文搜索,以尝试查找可能的匹配项。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top