【问题标题】:Performant techniques for finding similar values in SQL?在 SQL 中查找相似值的高性能技术?
【发布时间】:2010-11-09 14:42:39
【问题描述】:

所以我在一个表中有一个列,其中包含一个字符串值(从第 3 方工具填充的关键字)。我正在开发一种自动化工具来识别可能被标准化为单个值的相似值的集群。例如,“Firemen”/“Fireman”、“Isotope”/“Asotope”或“Canine”/“Canines”。

计算 levenshtein 距离的方法似乎是理想的,但它涉及太多的字符串操作/比较,并且可能无法充分利用 SQL 索引。

我考虑过按列的 Left(X) 字符进行增量分组,这是最大化索引使用的一种不错的方法,但这种方法实际上只在查找最后有差异的单词时才有效这个词的。

谁有一些好的想法可以在 SQL 中有效地解决这个问题?

注意:我意识到这个问题与 (Finding how similar two strings are) 非常相似,但这里的区别是需要在 SQL 中高效地执行此操作。

【问题讨论】:

    标签: sql pattern-matching


    【解决方案1】:

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

    【讨论】:

    • 目前我正在使用 T-SQL,但我没有提及它,希望得到一个可能在多个数据库平台上工作的更通用的答案。 Soundex/Difference 方法看起来很有希望。我会试一试。
    【解决方案2】:

    如果您使用的是 SQL Server,您可能会考虑使用 SOUNDEX() 函数,如下所示:

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

    它应该对字符串进行语音匹配...

    一些奇怪的例子......所以看起来你可以通过总是将复数文本附加到两侧来捕捉复数,因为多个 's 的声音相同......:-)

    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
    

    【讨论】:

    • Soundex 解析单词的复数形式有什么经验吗?听起来它对“消防员”/“消防员”来说会很好,但对于“犬”/“犬”来说可能就不那么好了。
    【解决方案3】:

    John,如果您使用的是 MS SQL Server,您可以利用 Full-Text Indexing 服务。全文搜索功能具有some powerful functions,您可以使用它来实现这一目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 2023-03-18
      • 2011-07-27
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      相关资源
      最近更新 更多