我有一个Microsoft SQL Server数据库表,其中包含大约700万个众包记录,主要包含字符串名称值以及一些相关详细信息。对于几乎所有的记录,似乎有十几个类似的错字记录,我正在尝试进行一些模糊匹配来识别记录组,例如" Apple"," Aple","苹果"," Spple"等。这些名称也可以包含多个单词,它们之间有空格。
我已经提出了一种使用编辑距离标量函数的解决方案,该函数返回从string1到string2的转换所需的击键次数,并使用该函数将表连接到自身。可以想象,由于必须执行数百万次函数来评估连接,因此这并不能很好地执行。
所以我把它放在一个游标中,所以至少一次只评估一个string1,这至少会得到结果但是在让它运行数周后它只通过评估150,000条记录。有700万人要评估,我不认为我有这种方法可以采取的方式。
我在字符串名称上放置了全文索引,但是当我没有找到我正在搜索的静态值时,它无法真正找到使用全文谓词的方法。
任何想法如何以不会花费数月才能运行的方式执行以下操作?
SELECT t1.name, t2.name
FROM names AS t1
INNER JOIN names AS t2
ON EditDistance(t1.name,t2.name) = 1
AND t1.id != t2.id
答案 0 :(得分:0)
您可以使用DIFFERENCE ( character_expression , character_expression )
函数来评估每个字符表达式的SOUNDEX
代码的差异。 SOUNDEX
代码用于评估字符串之间的差异。
DIFFERENCE
将返回0(最大可能差异)和4(最小差异)的整数。您可以利用此值来确定字符串的匹配程度(例如,类似于DIFFERENCE(column1, column2) > 3
的条件将匹配SOUNDEX
和column1
的{{1}}值关闭的记录1)。
以下是column2
功能文档的链接:https://technet.microsoft.com/en-us/library/ms188753(v=sql.105).aspx
答案 1 :(得分:0)
您需要找到一种方法来避免将每条记录与其他记录进行比较。如果您只使用单个字段,则可以使用特殊数据结构,例如trie,例如https://github.com/mattandahalfew/Levenshtein_search