我正在尝试实现类似于 stackoverflow 标签建议输入字段的东西。在数据库中,我有两个表:一个用于标记,另一个用于标记别名或标记同义词(tagSynonyms)。
当用户输入一个词时,搜索引擎应该足够聪明地检测输入词的别名,并且只显示与输入词相对应的主标签。用 Bloodhound 实现这一点的最佳方法是什么?
我正在尝试实现类似于 stackoverflow 标签建议输入字段的东西。在数据库中,我有两个表:一个用于标记,另一个用于标记别名或标记同义词(tagSynonyms)。
当用户输入一个词时,搜索引擎应该足够聪明地检测输入词的别名,并且只显示与输入词相对应的主标签。用 Bloodhound 实现这一点的最佳方法是什么?
只需将键入的术语发送到服务器并执行类似于此的 sql 语句:
select name from tag t left outer join tagSyms s on s.tagID=t.tagID where s.alias=$searchstring OR t.tagName=$searchstring
并返回 json 格式的数据。JSON 格式:{ val: 'tagname' }
在客户网站上:
var engine = new Bloodhound({
name: 'tags',
remote: 'http://example.com/tags?q=%QUERY',
datumTokenizer: function(d) {
return Bloodhound.tokenizers.whitespace(d.val);
},
queryTokenizer: Bloodhound.tokenizers.whitespace
});
engine.initialize();
$("#inputField").typeahead(...);
另请查看 typeahead.js 中的 displayKey 和模板键
当你想要一个排序列表时,如果 sql 是有序的,你就可以了。
您可以控制建议框中的内容与模板一起显示:
例如,如果您也想显示计数器,只需将 JSON 编辑为 { val: 'tagname', counter:x } 并将 typeahead 编辑为:
.typeahead(
....,{
templates:{
suggestion:function(data){
return "<p>"+data.val+"(used: "+data.counter+" times)</p>";
}
},
source: engine.ttAdapter()
});