如何指定搜索数据时使用的密钥?

时间:2015-06-17 02:52:39

标签: typeahead.js bloodhound

我试图通过创建一个剥离了所有非单词字符的name字段来忽略数据的sanitized_name字段中的标点符号。我正在尝试使查询与已清理的字段匹配,然后显示相应的未清除名称(例如,“title subtitle”匹配{name:“title:subtitle!”,sanitized_name:“title subtitle”}并显示“title:副标题!“作为建议)。我无法使查询与未修改的name字段以外的任何内容匹配,包括所有标点符号。

我想我已经将它缩小到Bloodhound从不调用我的datumTokenizer - 我已经尝试将垃圾放入“datumTokenizer:......”但它的行为相同。这在Why is my datumTokenizer never getting called?之前已经被问过,但我认为并没有得到令人满意的回答。我还尝试清空我的缓存并在Chrome上重新加载,但它仍未被调用。

另一个更快的解决方案似乎是使用Bloodhound.tokenizers.nonword忽略name字段中的所有标点符号,但由于我的datumTokenizer从未被调用,所以我无法尝试这个。

我还尝试了一个模板(Use different value from JSON data instead of displayKey using Typeahead),它成功地让我可以选择在建议中显示的内容,但我仍在内部搜索name字段。我不知道如何改变我用来搜索的字段。

如果重要,我正在使用Typeahead.js 0.10.5,远程数据从运行在Ruby on Rails 4.2.0上的Searchkick传入,并且只是按顺序搜索命中的字符串数组。 / p>

代码:

  var games_object = new Bloodhound({
    datumTokenizer: function(d) {
      // Doesn't matter what's here
      console.log(d);
      return Bloodhound.tokenizers.obj.noasdfasdfnword("sanitized_name");
    },
    queryTokenizer: Bloodhound.tokenizers.nonword,
    // limit: 8,
    remote: {
      url: '/games/autocomplete?query=%QUERY',
      filter: function(results) {
        // console.log(results);
        return $.map(results, function(data) {
          return {
            "name": data,
            "sanitized_name": data
              .replace(/[^a-zA-Z0-9\s]/g, "")
              .replace(/\-/g, "")
              .replace(/\s+/, " ")
          };
        });
      },
    }
  });

  var games_promise = games_object.initialize();

  games_promise
    .done(function() { console.log('games searcher - success!'); })
    .fail(function() { console.log('games searcher - error!'); });

  $('#game_search').typeahead({
    highlight: true,
    minLength: 2
  }, {
    name: 'games',
    displayKey: 'name',
    source: games_object.ttAdapter(),
    templates: {
      header: "<h4 class='section-header'>Standalone games</h4>",
  });

0 个答案:

没有答案