希望我没有重复这个问题。在这里发布之前,我在这里做了一些搜索和谷歌。
我正在使用SQLServer2008R2运行一个启用全文的eStore。
我的要求,
我正在使用混合全文和正常喜欢做搜索。这给出了更多相关的结果。对临时表和区分执行的所有查询都被返回。
匹配逻辑,
所有这些组合工作在一个合理的速度良好,并返回相关产品的关键字。
但我正在寻找进一步改进时,没有发现任何产品。
假设客户寻找‘CLC2200npk’,而这个产品并不存在,我需要在'CLC 2200‘之前显示下一个非常接近的。
到目前为止,我尝试使用Soundex()函数。为TextSearch列中的每个单词购买计算soundex值,并与关键字的soudex值进行比较。但这返回了太多的记录,而且速度也很慢。
例如,“CLC2200npk”将返回“CLC 1100”等产品,但这不是一个好结果。因为它不接近CLC2200npk
还有一个好的here。但这使用CLR函数。但是我不能在服务器上安装CLR函数。
所以我的逻辑应该是
如果“CLC2200npk”未找到,则在“CLC 2200”旁边显示“CLC 2200”,如果“CLC 2200”未找到,则显示下一个“CLC 1100”关闭
问题
谢谢。
发布于 2013-11-19 08:17:39
一个比较快速的领域特定的解决方案可能是使用SOUNDEX和两个字符串之间的数字距离来计算字符串的相似性。只有当你有大量的产品代码时,这才会有真正的帮助。
使用下面这样的简单UDF,您可以从字符串中提取数字字符,这样就可以从‘CLC2200npk’中提取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秒。
https://stackoverflow.com/questions/20064445
复制相似问题