现在我的自动填充数据存在于我的服务器上,该服务器使用LIKE查询来查找匹配项。具体来说,我正在获取“q”参数的值,将其拆分为空格,并查找匹配每个单词的Songs
:(使用SearchLogic)
@songs = Song.sortable_name_like_all(params[:q].to_s.split)
由于我没有很多歌曲,我认为如果我将所有歌曲一次性发送到客户端,然后根据客户端数据自动完成,用户体验可能会更好。
我的服务器现在返回一个看起来像这样的JSON数组:
[{"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(); });
但是现在自动完成使用精确的字符串匹配,这意味着“年轻人”不会与“Young Jeezy(Ft.Jay-Z) - Put On”相匹配。
如何在这里使用LIKE匹配?
答案 0 :(得分:1)
我认为最好的方法是使用regular expressions然后您可以将输入转换为正则表达式并测试您的候选者对该表达式。
一个简单的开始是从点星开始。*以。*结尾并用。*
替换搜索词中的所有空格。希望这足以开始。
答案 1 :(得分:1)
在JavaScript中,您可以与indexOf实现“LIKE”式匹配。例如
var song = "Hello World Song";
if (song.indexOf("World") > -1) alert("World is in the song");
我唯一的另一个评论是你的歌曲列表可能会增长(我想),你最终会最终打电话给你的服务器 - 所以为什么不现在呢?
答案 2 :(得分:1)
为什么不研究flickr为自动完成做了什么,他们是在客户端使用正则表达式进行的http://code.flickr.com/blog/2009/03/18/building-fast-client-side-searches/