希望我不重复这个问题。我在这里做了一些搜索和google,然后发布在这里。
我正在运行带有SQL Server 2008R2并启用了全文的电子商店。
我正在使用混合全文和正常搜索。这提供了更相关的结果。执行了对临时表和区别执行的所有查询。
匹配逻辑,
运行以下SQL以使用全文获取相关产品。但@Keywords将被预处理。说'CLC 2200'将更改为'CLC * AND 2200 *'
SELECT Id FROM dbo.Product WHERE CONTAINS(TextSearch,@ Keywords)
另一个查询将使用普通的运行方式运行。所以'CLC 2200'将被预处理为'TextSearch like%clc%AND TextSearch like%2200%'。这仅仅是因为全文搜索不会在关键字之前搜索模式。例如,它不会返回'pclc 2200'。
SELECT Id FROM dbo.Product WHERE TextSearch like'%clc%'AND TextSearch like'%2200%'
如果步骤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还有一个好的here。但这使用CLR功能。但我无法在服务器上安装CLR功能。
所以我的逻辑需要,
如果找不到'CLC 2200npk',则显示'CLC 2200'附近 如果找不到“CLC 2200”,请在“CLC 1100”旁边显示
感谢。
答案 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实现)
Here是一篇有趣的文章,它将两种算法同时应用,可能会给你一些想法。
希望其中一些有点帮助。
编辑:Here是一个更快的部分Levenshtein距离实现(阅读帖子它不会返回与正常结果完全相同的结果)。在我的测试表上有125000行,它在6秒内运行,相比之下我连接的第一个60秒。