2008-10-21 127 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