【问题标题】:How to call Levenshtien Function using the values from two different tables in T-SQL如何使用 T-SQL 中两个不同表的值调用 Levenshtien 函数
【发布时间】:2019-03-02 23:25:31
【问题描述】:

我正在尝试查找两个不同表 TableA 和 TableB 的列之间的 Levenshtien 距离。基本上我需要将 TableA 的 ColumnA 与 TableB 中 ColumnB 的所有元素进行匹配,并找到 Levenshtien 距离

我创建了一个 Levenshtien 函数,如下所示

CREATE FUNCTION [Levenshtein]
     (@value1 [NVARCHAR](MAX), 
      @value2 [NVARCHAR](MAX))
RETURNS [INT]
AS 
EXTERNAL NAME [FastenshteinAssembly].[Fastenshtein.Levenshtein].[Distance]
GO

这基本上是在调用我机器上的 Levenshtien dll。我尝试为此操作创建一个存储过程,但我不确定这是否是一种优化方法。

表 B 包含数百万个 CompanyName,而 TableA 也包含数千个 CompanyName,因此此操作本质上是 (n*m) 个操作。

实现这一目标的优化方法是什么。

谢谢

【问题讨论】:

    标签: sql-server tsql optimization levenshtein-distance


    【解决方案1】:

    没有优化的方法来做到这一点。

    您可以采取一些技巧来简化处理过程。例如,您可以使用 n-gram 在每一侧创建查找表,并且只比较 ngram 接近的名称。或者,您可以将soundex() 用于相同目的——或前三个字符。

    但是,如果您需要匹配所有可能性,那么这在 SQL Server 中是一个昂贵的 n*m 操作。

    【讨论】:

    • 谢谢 Gordon,我最初尝试过使用 C#,我会从 TableA 中获取一批,从 TableB 中获取一批,然后使用 LINQ 投影并对这些值进行叉积并调用 Levenshtien 函数并行但运行 10-20 分钟后,我得到一个线程中止异常。我认为用 SQL 做会更好。
    • 如果我引入一个阈值,只从 TableB 中获取编辑距离为 5 的值。它可以让它更快
    • @user5593950 。 . .一点也不。所有的值仍然需要计算。你需要做一些初步的工作来减少匹配的数量——我想到了 ngrams。对于较短的字符串,5 的距离相当大。例如,“丹佛”和“达拉斯”的距离为 5。“法国”和“弗雷斯诺”的距离为 4。“俄罗斯”和“苏联”的距离为 3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多