好的家伙使用jQuery-UI AutoComplete处理搜索建议,结果来自sql-sever 2008 db。使用AdventureWorks DB Products表进行测试。我想在这个例子中搜索2个字段。 ProductNumber和Name。
我之前提出了两个与此相关的问题...... here和here
到目前为止,我已经提出了这个......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的长度成正比...所以当搜索字符串增长并变得更具体时......容差会减少......想法?
答案 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