3

我正在尝试实现类似于 stackoverflow 标签建议输入字段的东西。在数据库中,我有两个表:一个用于标记,另一个用于标记别名或标记同义词(tagSynonyms)。

当用户输入一个词时,搜索引擎应该足够聪明地检测输入词的别名,并且只显示与输入词相对应的主标签。用 Bloodhound 实现这一点的最佳方法是什么?

4

1 回答 1

0

只需将键入的术语发送到服务器并执行类似于此的 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()

});

于 2014-09-27T21:47:57.847 回答