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