首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL模糊匹配

SQL模糊匹配
EN

Stack Overflow用户
提问于 2013-11-19 06:11:39
回答 1查看 50.5K关注 0票数 14

希望我没有重复这个问题。在这里发布之前,我在这里做了一些搜索和谷歌。

我正在使用SQLServer2008R2运行一个启用全文的eStore。

我的要求,

  1. 有一个产品表,其中有产品名称,OEM代码,模型,该产品适合。都在短信里。
  2. 我创建了一个名为TextSearch的新列。此产品具有产品名称、OEM代码和型号的连接值,适合此产品。这些值是逗号分隔的。
  3. 当客户输入关键字时,我们在TextSearch列上运行搜索以匹配产品。请参见下面的匹配逻辑。

我正在使用混合全文和正常喜欢做搜索。这给出了更多相关的结果。对临时表和区分执行的所有查询都被返回。

匹配逻辑,

  1. 运行以下SQL以获得使用全文的相关产品。但是@关键字将被预处理。假设“CLC 2200”将改为“CLC*和2200*” 从dbo.Product中选择Id,其中包含(TextSearch,@关键字)
  2. 另一个查询将使用普通的相似方式运行。因此,“clc 2200”将被预处理为'TextSearch类%clc%和TextSearch类似%2200%‘。这仅仅是因为全文搜索不会在关键字之前搜索模式。例如,它不会返回'pclc 2200‘。 从dbo.Product中选择Id,其中TextSearch喜欢'%clc%‘,TextSearch像'%2200%’
  3. 如果步骤1和步骤2没有返回任何记录,将执行以下搜索。我对Value 135进行了微调,以返回更多相关的记录。 从p.id中选择dbo.Product作为p内连接FREETEXTTABLE(积,TextSearch,@关键字)作为r ON p.Id = r.KEY,其中r.RANK > 135

所有这些组合工作在一个合理的速度良好,并返回相关产品的关键字。

但我正在寻找进一步改进时,没有发现任何产品。

假设客户寻找‘CLC2200npk’,而这个产品并不存在,我需要在'CLC 2200‘之前显示下一个非常接近的。

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

例如,“CLC2200npk”将返回“CLC 1100”等产品,但这不是一个好结果。因为它不接近CLC2200npk

还有一个好的here。但这使用CLR函数。但是我不能在服务器上安装CLR函数。

所以我的逻辑应该是

如果“CLC2200npk”未找到,则在“CLC 2200”旁边显示“CLC 2200”,如果“CLC 2200”未找到,则显示下一个“CLC 1100”关闭

问题

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-19 08:17:39

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

使用下面这样的简单UDF,您可以从字符串中提取数字字符,这样就可以从‘CLC2200npk’中提取2200个字符,从'CLC 1100‘中提取1100个字符,这样现在就可以根据每个输入的SOUNDEX输出以及每个输入的数字组件的接近性来确定是否接近。

代码语言:javascript
复制
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 -这个algo会给你一个比soundex更好的匹配速度,它确实是很好的拼写纠正,尽管。
  • Levenshtein Distance --这将计算出从“CLC2200npk”到“CLC2200”是3,而从“CLC2200npk”到“CLC1100”则需要多少按键才能将一个字符串转换为另一个字符串。

Here是一篇有趣的文章,它将两个标志结合在一起,这可能会给你一些想法。

希望这能帮上点忙。

编辑:Here是一个更快的部分Levenshtein距离实现(阅读文章,它不会返回完全相同的结果与正常的)。在我的125000行测试表上,它在6秒内运行,而对于我链接到的第一个测试表,则是60秒。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20064445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档