2

好吧,伙计们正在使用 jQuery-UI AutoComplete 和来自 sql-sever 2008 db 的结果来处理搜索建议。使用 AdventureWorks DB Products 表进行测试。我想在此示例中搜索 2 个字段。产品编号和名称。

我之前问了两个与此相关的问题......这里这里

到目前为止,我想出了这个......

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 实施(链接到上一个问题)...

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

最好根据“似乎”对我的给定数据集有效的值来选择任意值吗?还是最好根据输入字符串的长度动态调整它...

我最初的想法是该值应该与 searchString 的长度成反比......所以随着搜索字符串的增长并变得更加具体......容差减少......想法?

4

2 回答 2

0

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

于 2011-01-06T12:35:49.993 回答
0

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

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

但这不会与 结合使用,LIKE因为它不会返回任何相关值。但是使用 LIKE 根本不是一个好主意。如果有人向“牙齿”小费购买“牙膏”,他会得到“蓝牙”作为提议。

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

于 2014-08-13T15:08:39.627 回答