我正在尝试实现类似于stackoverflow标签建议输入字段的内容。在数据库中,我有两个表:一个用于标记,另一个用于标记别名或标记同义词(tagSynonyms)。
当用户键入一个术语时,搜索引擎应该足够聪明以检测键入的术语的别名,并仅显示与该键入的术语相对应的主要标签。用猎犬实现此目标的最佳方法是什么?
最佳答案
只需将输入的术语发送到服务器并执行类似于此语句的sql语句:
从s.tagID = t.tagID上的标签t左外部联接tagSyms中选择名称
其中s.alias = $ searchstring或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(
....,{
templates:{
suggestion:function(data){
return "<p>"+data.val+"(used: "+data.counter+" times)</p>";
}
},
source: engine.ttAdapter()
});