如何使Twitter预先确定完全匹配的单词和短语

时间:2013-05-13 07:57:41

标签: twitter-bootstrap bootstrap-typeahead

Twitters Typeahead匹配短语中任意位置的任何字词,因此搜索“car”结果可以来自带有匹配“car”的第二个单词的短语。例如,当用名片搜索列表中的汽车时。名片出现,更糟糕的是它出现在汽车前。 IE:

Search Term: Car
Suggestions:
Business Card
Car
Car Pool
Carbon

我希望它更像谷歌和推特(他们从来没有提出过一些与开头输入的内容完全不匹配的东西),其中键入的词是最相关的,因此汽车在打字时比汽车更有意义名片。

我希望它实际上只是停止匹配第二个单词,直到有人键入空格并开始第二个单词。因此,在上面的例子中,除非我输入了名片,否则名片不会出现在列表中:

Business C

如何停止匹配并建议从键入搜索的开头不完全匹配的单词的行为。

另一种说法是如何阻止预先标记或分割空间。 typeahead总是匹配单词的开头(^),所以如果空格不被识别为单词边界,那么它将更像google和twitters用户期望的那样。

感谢您的帮助, 泰勒

更新1。

我更新了我的数据集,以返回一个具有值和标记的基准,以便typeahead _transformDatum方法不会通过拆分空格来标记标记。这很有效,现在它可以按预期工作:

价值观:Apple,Great Ape

搜索字词:Ap 建议: 苹果

这就是我想要的。但现在有一个新问题。

问题:使用带空格的搜索字词时,不会返回任何建议。

所以现在当我输入“great”时,一旦我输入空格,建议就会停止。:

搜索字词:很棒(有空格) 建议: (无)

我认为令牌不能有空格。即使文档没有在一个问题中明确说明这一点:

  

数据的规范形式是具有value属性和a的对象   令牌财产。 value是表示底层的字符串   datum和tokens的值是一组有用的字符串   匹配基准的typeahead.js与给定的查询。

2 个答案:

答案 0 :(得分:1)

apt将是:

  matcher: function (item) {
      if (item.toLowerCase().indexOf(this.query.trim().toLowerCase()) == 0) {
          return true;
      }
  },

答案 1 :(得分:0)

你可以

$('.typeahead').typeahead({source:myarray, matcher: function(item){
    var reg = new RegExp('^'+this.query);
    if( item.match(reg) ) return true;
    else return false;
 }})