【问题标题】:Client-side autocomplete that matches with LIKE与 LIKE 匹配的客户端自动完成
【发布时间】:2009-11-24 08:11:51
【问题描述】:

现在我的自动完成数据保存在我的服务器上,它使用 LIKE 查询来查找匹配项。具体来说,我正在获取“q”参数的值,将其拆分为空格,并寻找匹配每个单词的Songs:(使用 SearchLogic)

@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) - 穿上"}]

我的自动完成看起来像这样:

  $("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 on”不会匹配“Young Jeezy (Ft. Jay-Z) - Put On”。

如何在这里使用 LIKE 匹配?

【问题讨论】:

    标签: jquery ruby-on-rails autocomplete


    【解决方案1】:

    我认为最好的方法是使用regular expressions,然后您可以将输入转换为正则表达式并根据该表达式测试您的候选人。

    一个简单的开始就是以点星 .* 开头,以 .* 结尾,并将搜索词中的所有空格替换为 .*

    希望这足以开始。

    【讨论】:

    • 我认为通过对搜索字符串进行标记(例如,通过空格),分别匹配每个标记,并显示按分数排序的结果(匹配的标记数),他会得到更好的服务
    【解决方案2】:

    在 JavaScript 中,您可以使用 indexOf 实现“LIKE”样式的匹配。例如

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

    我唯一的其他评论是,您的歌曲列表可能会增加(我想)并且您最终会调用您的服务器 - 那么为什么不现在就这样做呢?

    【讨论】:

      【解决方案3】:

      你为什么不看看 flickr 为自动完成做了什么,他们在客户端使用正则表达式 http://code.flickr.com/blog/2009/03/18/building-fast-client-side-searches/

      【讨论】:

        猜你喜欢
        • 2018-06-14
        • 2016-02-24
        • 2012-02-11
        • 2018-05-08
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多