Levenshtein编辑距离的Google样式搜索建议

时间:2010-12-23 15:20:17

标签: sql sql-server tsql autocomplete levenshtein-distance

好的家伙使用jQuery-UI AutoComplete处理搜索建议,结果来自sql-sever 2008 db。使用AdventureWorks DB Products表进行测试。我想在这个例子中搜索2个字段。 ProductNumber和Name。

我之前提出了两个与此相关的问题...... herehere

到目前为止,我已经提出了这个......

CREATE procedure [dbo].[procProductAutoComplete]
(
    @searchString nvarchar(100)
)
as
begin

    declare @param nvarchar(100);
    set @param = LOWER(@searchString);

WITH Results(result)
AS
(
    select TOP 10 Name as 'result'
    from Production.Product 
    where LOWER(Name) like '%' + @param + '%' or (0 <= dbo.lvn(@param, LOWER   (Name), 6))
    union
    select TOP 10 ProductNumber as 'result'
    from Production.Product
    where LOWER(ProductNumber) like '%' + @param + '%' or (0 <= dbo.lvn(@param,  LOWER(ProductNumber), 6))
)

SELECT TOP 20 * from Results

end;

我现在的问题是结果的排序......我得到了正确的结果,但它们只是按名称或产品编号排序,与输入字符串无关......

例如,我可以搜索以“BZ-”开头的产品编号,返回的最高结果是以“A”开头的ProductNums,尽管我在列表的其他位置获得了更多相关结果..

根据与搜索字符串的相关性对结果进行排序的任何想法??

编辑:

关于找到的levenschtein距离的tql实现here(链接到上一个问题)...

我想知道确定要发送到函数的MAX值的最佳方法是什么(在上面的示例中为6)

最好根据“看起来”对我的给定数据集选择一个任意值吗?或者最好根据输入字符串的长度动态调整它......

我最初的感觉是,值应该与searchString的长度成正比...所以当搜索字符串增长并变得更具体时......容差会减少......想法?

2 个答案:

答案 0 :(得分:0)

全文搜索功能似乎是使用SQL Server时的方法

答案 1 :(得分:0)

相关性是dbo.lvn()的结果。它返回将一个字符串转换为另一个字符串所需的操作量。所以答案很简单:

ORDER BY dbo.lvn(@param, LOWER (Name), 6)

但是这不会与LIKE组合使用,因为这不会返回任何相关值。但LIKE的使用根本不是一个好主意。如果有人正在倾诉&#34;牙齿&#34;购买&#34;牙膏&#34;他会得到&#34; bluetooth&#34;作为提案。

为了让devlim更快,请阅读: https://stackoverflow.com/a/14261807/318765