【发布时间】:2013-11-19 06:11:39
【问题描述】:
希望我不要重复这个问题。在发帖之前,我在这里和谷歌上做了一些搜索。
我正在使用启用全文的 SQL Server 2008R2 运行 eStore。
我的要求,
- 有一个产品表,其中包含产品名称、OEM 代码、该产品适合的型号。都是文字。
- 我创建了一个名为 TextSearch 的新列。这具有该产品适合的产品名称、OEM 代码和型号的串联值。这些值以逗号分隔。
- 当客户输入关键字时,我们会在 TextSearch 列上运行搜索以匹配产品。请参阅下面的匹配逻辑。
我正在使用混合全文和正常的搜索。这给出了更相关的结果。所有在临时表中执行的查询和不同的都被返回。
匹配逻辑,
-
运行以下 SQL 以使用全文获取相关产品。但@Keywords 将被预处理。假设“CLC 2200”将更改为“CLC* AND 2200*”
SELECT Id FROM dbo.Product WHERE CONTAINS (TextSearch ,@Keywords)
-
另一个查询将使用正常的like运行。所以'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”旁边显示下一个关闭
问题
- 是否可以按照建议进行匹配?
- 如果我需要进行拼写更正和搜索,有什么好的方法?我们所有的产品列表都是英文的。
- 是否有任何 UDF 或 SP 来匹配我的建议之类的文本?
谢谢。
【问题讨论】:
标签: sql-server sql-server-2008 full-text-search fuzzy-search