Jey*_*ara 11 sql-server full-text-search fuzzy-search sql-server-2008
希望我不要重复这个问题.我在这里做了一些搜索和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喜欢'%clc%'和TextSearch喜欢'%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
还有另外一个好这里.但这使用CLR功能.但我无法在服务器上安装CLR功能.
所以我的逻辑需要,
如果'CLC 2200npk'未找到,如果'CLC 2200'未找到则显示'CLC 2200'附近,接下来显示'CLC 1100'
谢谢.
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实现可用)
这是一篇有趣的文章,它将两种算法同时应用于一起,可能会给你一些想法.
希望其中一些有点帮助.
编辑:这是一个更快的部分Levenshtein距离实现(阅读帖子它不会返回与正常结果完全相同的结果).在我的125000行测试表上,它在6秒内运行,相比之下我连接的第一个60秒.