2009-07-10 75 views
0

所以我有一个表中包含字符串值(从第三方工具填充关键字)的列。我正在开发一个自动化工具来识别可能被标准化为单个值的类似值的集群。例如,“消防员”/“消防员”,“同位素”/“同位素”或“犬”/“犬”。用于在SQL中查找相似值的高性能技术?

计算的Levenshtein距离似乎除了它涉及太多的字符串操作/比较并有可能使用了劣质的SQL指标的事实,理想的一种方法。

我已经考虑过使用列的Left(X)字符进行递增分组,这是一种不太糟糕的方式来最大化索引使用,但是这种方法实际上只能有效地发现具有差异的单词这个词的结尾。

任何人都得到了在SQL有效地解决这个问题的一些好的想法?

注:我知道这个问题是非常相似的(Finding how similar two strings are),但这里的区别是需要在SQL有效地做到这一点。

回答

1

如果您正在使用SQL Server,你可能会考虑使用SOUNDEX()函数中:

... 
where 
    SOUNDEX("searchterm") = SOUNDEX(searchvaluefield) 

它应该做的琴弦语音匹配...

一些奇怪例子......如此看来,你可以通过始终追加复数文字两边赶复数,因为多的的声音一样... :-)

select soundex('Canine'), soundex('Canines') 
go 

----- ----- 
C550 C552 

1 Row(s) affected 


select soundex('Canine'), soundex('Caynyn') 
go 

----- ----- 
C550 C550 

1 Row(s) affected 


select soundex('Canines'), soundex('Caniness') 
go 

----- ----- 
C552 C552 

1 Row(s) affected 
+0

有关Soundex如何解决单词复数版本的任何经验?听起来好像对“消防员”/“消防员”会有好处,但对于“犬”/“犬”也许不会那么好。 – JohnFx 2009-07-10 04:47:57

2

您没有提及您使用的DB,但如果是T-SQL,则可以使用SOUNDEX值和difference

+0

目前我正在使用T-SQL,但是我没有提到它,希望得到可能在多个数据库平台上工作的更一般化的答案。 虽然Soundex/Difference方法看起来很有希望。我会给它一个旋转。 – JohnFx 2009-07-10 04:45:56