我试图通过创建一个剥离了所有非单词字符的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>",
});