如何在具有相似字符串值的表中查找行

时间:2017-07-15 20:11:45

标签: sql sql-server full-text-search fuzzy-search data-cleaning

我有一个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

2 个答案:

答案 0 :(得分:0)

您可以使用DIFFERENCE ( character_expression , character_expression )函数来评估每个字符表达式的SOUNDEX代码的差异。 SOUNDEX代码用于评估字符串之间的差异。

DIFFERENCE将返回0(最大可能差异)和4(最小差异)的整数。您可以利用此值来确定字符串的匹配程度(例如,类似于DIFFERENCE(column1, column2) > 3的条件将匹配SOUNDEXcolumn1的{​​{1}}值关闭的记录1)。

以下是column2功能文档的链接:https://technet.microsoft.com/en-us/library/ms188753(v=sql.105).aspx

答案 1 :(得分:0)

您需要找到一种方法来避免将每条记录与其他记录进行比较。如果您只使用单个字段,则可以使用特殊数据结构,例如trie,例如https://github.com/mattandahalfew/Levenshtein_search