SQL模糊匹配

时间:2013-11-19 06:11:39

标签: sql-server sql-server-2008 full-text-search fuzzy-search

希望我不重复这个问题。我在这里做了一些搜索和google,然后发布在这里。

我正在运行带有SQL Server 2008R2并启用了全文的电子商店。

我的要求,

  1. 有一个产品表,其中包含该产品适用的产品名称,OEM代码,型号。所有都是正文。
  2. 我创建了一个名为TextSearch的新列。它具有此产品适用的产品名称,OEM代码和型号的连接值。这些值以逗号分隔。
  3. 当客户输入关键字时,我们会在TextSearch列上运行搜索以匹配产品。请参阅下面的匹配逻辑。
  4. 我正在使用混合全文和正常搜索。这提供了更相关的结果。执行了对临时表和区别执行的所有查询。

    匹配逻辑,

    1. 运行以下SQL以使用全文获取相关产品。但@Keywords将被预处理。说'CLC 2200'将更改为'CLC * AND 2200 *'

      SELECT Id FROM dbo.Product WHERE CONTAINS(TextSearch,@ Keywords)

    2. 另一个查询将使用普通的运行方式运行。所以'CLC 2200'将被预处理为'TextSearch like%clc%AND TextSearch like%2200%'。这仅仅是因为全文搜索不会在关键字之前搜索模式。例如,它不会返回'pclc 2200'。

      SELECT Id FROM dbo.Product WHERE TextSearch like'%clc%'AND TextSearch like'%2200%'

    3. 如果步骤1和2未返回任何记录,则将执行以下搜索。价值135由我精心调整,以返回更多相关记录。

      SELECT p.id FROM dbo.Product AS p INNER JOIN FREETEXTTABLE(product,TextSearch,@ Keywords)AS r ON p.Id = r。[KEY] WHERE r.RANK> 135

    4. 以上所有组合在合理的速度下运行良好,并返回关键字的相关产品。

      但是当我找不到任何产品时,我正在寻求进一步改善。

      如果客户寻找'CLC 2200npk'且该产品不在那里,我需要在'CLC 2200'附近展示。

      到目前为止,我尝试使用 Soundex()功能。购买TextSearch列中每个单词的计算soundex值,并与关键字的soudex值进行比较。但这会返回太多记录而且速度也很慢。

      例如,'CLC 2200npk'将返回诸如'CLC 1100'等产品。但这不是一个好结果。因为它不接近CLC 2200npk

      还有一个好的here。但这使用CLR功能。但我无法在服务器上安装CLR功能。

      所以我的逻辑需要,

      如果找不到'CLC 2200npk',则显示'CLC 2200'附近 如果找不到“CLC 2200”,请在“CLC 1100”旁边显示

      问题

      1. 是否可以像建议的那样匹配?
      2. 如果我需要进行拼写纠正和搜索,那会是什么好方法?我们所有的产品清单都是英文版。
      3. 是否有任何UDF或SP来匹配我的建议之类的文字?
      4. 感谢。

1 个答案:

答案 0 :(得分:18)

一个相当快速的特定领域解决方案可能是使用SOUNDEX和2个字符串之间的数字距离来计算字符串相似度。只有当您拥有大量产品代码时,这才会真正有用。

使用如下的简单UDF,您可以从字符串中提取数字字符,这样您就可以从'CLC 2200npk'中获得2200,从'CLC 1100'获得1100,这样您现在可以根据SOUNDEX输出确定接近度每个输入的输入以及每个输入的数字分量的接近程度。

CREATE Function [dbo].[ExtractNumeric](@input VARCHAR(1000))
RETURNS INT
AS
BEGIN
    WHILE PATINDEX('%[^0-9]%', @input) > 0
    BEGIN
        SET @input = STUFF(@input, PATINDEX('%[^0-9]%', @input), 1, '')
    END
    IF @input = '' OR @input IS NULL
        SET @input = '0'
    RETURN CAST(@input AS INT)
END
GO

就通用算法而言,根据数据集大小和性能要求,有一些可能会帮助您取得不同程度的成功。 (两个链接都有TSQL实现)

  • Double Metaphone - 这个算法会以速度为代价给你一个比soundex更好的匹配,但它确实对拼写纠正有好处。
  • Levenshtein Distance - 这将计算将一个字符串转换成另一个字符串所需的按键次数,例如从“CLC 2200npk”到“CLC 2200”是3,而从“CLC 2200npk”到“CLC” 1100'是5。

Here是一篇有趣的文章,它将两种算法同时应用,可能会给你一些想法。

希望其中一些有点帮助。

编辑:Here是一个更快的部分Levenshtein距离实现(阅读帖子它不会返回与正常结果完全相同的结果)。在我的测试表上有125000行,它在6秒内运行,相比之下我连接的第一个60秒。