SQL模糊匹配

Jey*_*ara 11 sql-server full-text-search fuzzy-search sql-server-2008

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

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

我的要求,

  1. 有一个产品表,其中包含该产品适用的产品名称,OEM代码,型号.所有都是正文.
  2. 我创建了一个名为TextSearch的新列.它具有此产品适用的产品名称,OEM代码和型号的连接值.这些值以逗号分隔.
  3. 当客户输入关键字时,我们会在TextSearch列上运行搜索以匹配产品.请参阅以下匹配逻辑.

我正在使用混合全文和普通的搜索.这提供了更相关的结果.返回执行临时表和区别的所有查询.

匹配逻辑,

  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喜欢'%clc%'和TextSearch喜欢'%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

以上所有组合在合理的速度下工作正常,并返回关键字的相关产品.

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

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

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

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

还有另外一个好这里.但这使用CLR功能.但我无法在服务器上安装CLR功能.

所以我的逻辑需要,

如果'CLC 2200npk'未找到,如果'CLC 2200'未找到则显示'CLC 2200'附近,接下来显示'CLC 1100'

问题

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

谢谢.

Dav*_*wen 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
Run Code Online (Sandbox Code Playgroud)

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

  • Double Metaphone - 这个算法会以速度为代价给你一个比soundex更好的匹配,但它对于拼写校正来说真的很好.
  • Levenshtein距离 -这将计算需要多少按键需要把一个串到另一个例如摆脱"CLC 2200npk"到"CLC 2200"是3,而从"CLC 2200npk"到"CLC 1100"是5.

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

希望其中一些有点帮助.

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