2014-09-26 24 views
2

我想实现类似于stackoverflow标记建议输入字段的东西。在数据库中,我有两个表:一个是标签,另一个是tagaliases或标签同义词(tagSynonyms)。使用typeahead血猎犬来处理搜索项具有别名或同义词

当用户键入一个术语时,搜索引擎应该足够聪明以检测输入术语的别名,并仅显示与该输入术语对应的主标签。用猎狗来实现这个最好的方法是什么?

回答

0

只需发送的输入项到服务器,并执行类似下面这样的SQL语句:

从标签T

选择留下名字对外连接tagSyms小号s.tagID = t.tagID 其中s .alias = $ searchstring或t.tagName = $ searchstring

并返回json格式的数据。 JSON格式的:{VAL: '标记名'}

在客户端的网站:

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(...); 

而且看一看的displayKey和模板键在typeahead.js

当你想要一个排序列表,你会没事的,如果sql是有序的。

您可以控制在意见箱获取与模板显示的内容:

例如,如果你想显示的计数器也只需编辑JSON为{VAL:“标记名”,计数器:X} 和键入:

.typeahead(
     ....,{ 
     templates:{ 
      suggestion:function(data){ 
       return "<p>"+data.val+"(used: "+data.counter+" times)</p>"; 
      } 
     }, 
     source: engine.ttAdapter() 

});

+0

非常感谢回复。预计服务器端的SQL查询会根据其使用频率返回排序标签列表。换句话说,与每个标签的名称一起,我还需要通过“计数器”。显示的建议应根据与每个标签名称相关的“计数器”值以递减顺序显示可能的标签。 这是否有可能用血猎犬来实现? – Seme1 2014-09-28 14:17:22

+0

我的一些同义词与查询完全不同。我怎么能告诉猎犬他们是一样的?例如,当用户进入青色时,我将“青色”保存在数据库中作为“蓝色”的同义词。在建议列表中,即使用户输入了青色,我也希望显示“蓝色”而不是“青色”。 – Seme1 2014-09-28 15:37:24

相关问题