2009-11-24 28 views
1

現在,我的自動填充數據位於我的服務器上,該服務器使用LIKE查詢來查找匹配項。具體來說,我走的是「Q」參數的值,在空格分割它,並尋找每一個字匹配Songs:(使用SearchLogic)與LIKE相匹配的客戶端自動完成

@songs = Song.sortable_name_like_all(params[:q].to_s.split) 

因爲我沒有太多的歌曲,我如果我將所有歌曲一次發送到客戶端,然後基於客戶端數據自動完成,則用戶體驗可能會更好。

我現在服務器返回一個JSON陣列onready,看起來像這樣:

[{"path":"/lyrics/Young-jeezy-ft-jay-z/Go-crazy-remix","song":"Young Jeezy (Ft. Jay-Z) - Go Crazy (Remix)"},{"path":"/lyrics/Young-jeezy-ft-jay-z/Put-on","song":"Young Jeezy (Ft. Jay-Z) - Put On"}]

我的自動完成功能如下:

$("input.quick_search").autocomplete(data, { 
    formatItem: function(item) { 
     return item.song; 
    }, 
    formatResult: function(item) { 
     return "Loading..."; 
    } 
    }).result(function(event, choice, formatted) { 
     if (choice) { 
     window.location.href = choice.path; 
     } 
    }).click(function() { this.select(); }); 

但是現在的自動完成功能使用精確的字符串匹配,這意味着「年輕的「不匹配」年輕的Jeezy(Ft。Jay-Z) - 穿上「。

如何在這裏使用LIKE匹配?

回答

1

我認爲最好的方法是使用regular expressions然後您可以將輸入轉換爲正則表達式並測試您的候選人是否符合該表達式。

一個簡單的開始是先從點的明星。*結束與*,並替換您的搜索字詞的所有空格。*

希望這是足夠的開始。

+0

做在客戶端,我認爲他將是tokenising搜索字符串(由空格更好服務,例如),分別匹配每個令牌,並顯示按分數排序的結果(匹配的令牌數) – 2009-11-24 08:32:13

1

在JavaScript中,您可以通過indexOf實現「LIKE」風格的匹配。例如

var song = "Hello World Song"; 
if (song.indexOf("World") > -1) alert("World is in the song"); 

我唯一的其他的評論是,歌曲列表可能會增長(我想),你會最終使您的服務器最終調用 - 那麼爲什麼不現在就做呢?