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

Я пытаюсь игнорировать пунктуацию в поле 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>",
  });

person mz496    schedule 17.06.2015    source источник
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 17.06.2015