希望我没有重复这个问题。在在这里发帖之前,我在这里做了一些搜索和谷歌。
我正在使用启用全文的 SQL Server 2008R2 运行 eStore。
我的要求,
- 有一个产品表,其中包含产品名称、OEM 代码、该产品适合的型号。一切都在文字中。
- 我创建了一个名为 TextSearch 的新列。它包含该产品适合的产品名称、OEM 代码和型号的串联值。这些值以逗号分隔。
- 当客户输入关键字时,我们会在 TextSearch 列上运行搜索以匹配产品。请参阅下面的匹配逻辑。
我正在使用混合全文和普通的搜索。这给出了更相关的结果。返回临时表中执行的所有查询和不同值。
匹配逻辑,
-
运行以下 SQL 以使用全文获取相关产品。但@Keywords会被预处理。假设“CLC 2200”将更改为“CLC* AND 2200*”
从 dbo.Product 中选择 ID,其中包含(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”附近显示下一个产品。
到目前为止我尝试使用声音指数()功能。购买计算 TextSearch 列中每个单词的 soundex 值,并与关键字的 soudex 值进行比较。但这会返回太多记录并且速度也很慢。
例如,“CLC 2200npk”将返回“CLC 1100”等产品。但这不会是一个好的结果。因为它不接近 CLC 2200npk
还有一个不错的here https://stackoverflow.com/questions/921978/fuzzy-matching-using-t-sql。但这使用了 CLR 函数。但我无法在服务器上安装 CLR 功能。
所以我的逻辑应该是,
如果未找到“CLC 2200npk”,则显示“CLC 2200”附近
如果未找到“CLC 2200”,则显示紧邻“CLC 1100”的下一个
问题
- 是否可以像建议的那样进行匹配?
- 如果我需要进行拼写纠正和搜索,什么是好方法?我们所有的产品清单都是英文的。
- 是否有任何 UDF 或 SP 来匹配我的建议中的文本?
Thanks.
一个相当快速的特定领域解决方案可能是使用 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 实现)
-
双变音位 http://sqlmag.com/t-sql/double-metaphone-sounds-great- 该算法将为您提供比 soundex 更好的匹配,但以速度为代价,但它对于拼写纠正确实很有好处。
-
编辑距离 http://www.kodyaz.com/articles/fuzzy-string-matching-using-levenshtein-distance-sql-server.aspx- 这将计算将一个字符串转换为另一个字符串所需的按键次数,例如从“CLC 2200npk”到“CLC 2200”为 3 次,而从“CLC 2200npk”到“CLC 1100”为 5 次。
Here http://randomrumenations.blogspot.de/2009/06/improved-t-sql-levenshtein-distance.html是一篇有趣的文章,它将两种算法结合在一起,可能会给您一些想法。
好吧,希望其中一些能有所帮助。
EDIT: Here http://randomrumenations.blogspot.de/2009/06/improved-t-sql-levenshtein-distance.html是一种更快的部分 Levenshtein Distance 实现(阅读帖子,它不会返回与正常结果完全相同的结果)。在我的 125000 行测试表上,它在 6 秒内运行,而我链接到的第一个表则需要 60 秒。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)