Как мне указать, какой ключ использовать при поиске данных?

Я пытаюсь игнорировать пунктуацию в name поле моих данных путем создания sanitized_name поле, которое очищается от всех несловарных символов. Я пытаюсь сделать так, чтобы запрос соответствовал очищенному полю, а затем отобразил соответствующее неанифицированное имя (например, запрос "title subtitle" соответствует {name: "title: subtitle!", Sanitized_name: "title subtitle"} и отображает "title: субтитры! "как предложение). Я не смог получить запрос, чтобы соответствовать чему-либо, кроме неизмененного name поле, включая все знаки препинания.

Я думаю, что сузил его до Bloodhound, никогда не вызывая мой datumTokenizer - я пытался поместить мусор в "datumTokenizer:...", но он действует так же. Об этом уже спрашивали ранее. Почему мой datumTokenizer никогда не вызывается? но я не думаю, что это было удовлетворительным ответом. Я также попытался очистить кэш и перезагрузить Chrome, но он до сих пор не вызван.

Другим более быстрым решением является игнорирование всех знаков препинания в name с помощью Bloodhound.tokenizers.nonword, но так как мой datumTokenizer никогда не вызывается, я не смог попробовать это.

Я также попробовал шаблон ( используйте значение, отличное от данных JSON вместо displayKey с помощью Typeahead), который успешно дает мне возможность выбирать, что отображать в предложениях, но я все еще внутренне ищу по name поле. Я не знаю, как изменить поле, которое я использую для поиска.

Если это имеет значение, я использую Typeahead.js 0.10.5, и удаленные данные передаются из Searchkick, запущенного на Ruby on Rails 4.2.0, и представляют собой просто массив строк поисковых запросов по порядку.

Код:

  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 ответов

Другие вопросы по тегам