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