2010-12-23 111 views
2

確定工作的搜索建議使用jQuery-UI自動完成從sql-sever 2008分貝的結果。使用AdventureWorks DB Products表進行測試。我想在這個例子中搜索兩個字段。產品編號和名稱。谷歌風格搜索建議與Levenshtein編輯距離

我問兩個問題早與本... 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-」開頭的產品編號和頂部返回的結果是ProductNums以「A」開頭,儘管我在列表中的其他地方獲得了更多相關結果..

有關按搜索字符串的相關性對結果進行排序的任何想法?

編輯:

在問候的TQL實施levenschtein距離發現here(在以前的問題鏈接)...

我想知道什麼是確定的最大價值的最佳途徑發送到函數(在我上面的示例中爲6)

根據「似乎」爲我的給定數據集運行良好選擇一個任意值最好嗎?或者最好根據輸入字符串的長度進行動態調整...

我最初的想法是,值應該與searchString的長度成正比......所以搜索字符串成長,變得更具體..容忍減少...思想??

+2

嗯,@ u07ch已經回答了你的前一個問題,越簡單,最有效的方法就是使用FULLTEXT索引。不僅搜索速度更快(速度更快),還可以查看詞的派生詞,並根據相關性獲得排名。 – Lamak 2010-12-23 15:40:23

回答

0

全文搜索功能似乎是使用SQL Server時

0

的相關性是dbo.lvn()結果的路要走。它返回將一個字符串轉換爲另一個字符串所需的操作數量。因此,答案很簡單:

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

但這不會結合工作的LIKE,因爲這不返回任何關聯的值。但LIKE的使用並不是一個好主意。如果有人提示「牙齒」購買「牙膏」,他會得到「藍牙」的建議。

爲了devlim這裏更快的讀取: https://stackoverflow.com/a/14261807/318765