智能数据库搜索

时间:2008-10-21 18:22:00

标签: c# asp.net sql-server web-services dynamics-sl

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

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

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

4 个答案:

答案 0 :(得分:5)

algorithm最适合您的细节在很大程度上取决于您的域名,因此我建议尝试一些不同的域名 - 您甚至可能需要合并一些以获得最佳结果。缩写,尤其是特定领域的缩写,可能也需要进行预处理或标准化。

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

对于胖指法,使用edit distance算法可能会更好 - 这会在两个单词之间产生“差异”。这些将使史密斯和斯莫斯在一起得分 - 即使2可能会通过语音搜索。

T-SQL有SOUNDEX和DIFFERENCE - 但它们非常糟糕。 Levenshtein变体是规范的选择,但是还有其他很好的选择 - 如果你找不到合适的许可实现,那么大多数很容易在C#中实现

所有这些都比C-SQL更容易编写/使用C#(尽管我确实找到了可能在SQL中工作的double metaphone in a horrendous abuse of T-SQL)。

虽然这个example is in Access(我从未真正查看过代码,或者使用过实现),但所包含的演示文稿可以很好地了解您最终可能需要做什么。代码可能值得一看,也许是来自VBA的端口。

答案 1 :(得分:1)

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

SOUNDEX @ MSDN

SOUNDEX @ Wikipedia

答案 2 :(得分:1)

如果可以将{{d3}}集成到您的解决方案中,那么您一定要尝试一下。

答案 3 :(得分:0)

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