了解Bloodhound.tokenizers.obj.whitespace

时间:2015-10-28 02:16:14

标签: jquery twitter twitter-typeahead bloodhound

所有,我试图根据一些工作样本将Twitter typeaheadBloodhound应用到我的项目中,但我无法理解下面的代码。

datumTokenizer: Bloodhound.tokenizers.obj.whitespace('songs'),
queryTokenizer: Bloodhound.tokenizers.whitespace,

原始代码如下所示。

var songlist = new Bloodhound({
                datumTokenizer: Bloodhound.tokenizers.obj.whitespace('songs'),
                queryTokenizer: Bloodhound.tokenizers.whitespace,
                limit: 10,
                remote: '/api/demo/GetSongs?searchTterm=%QUERY'

            });

official document刚说:

  

datumTokenizer - 具有转换签名(datum)的函数   将数据转换为字符串标记数组。必需的。

     

queryTokenizer - 具有转换的签名(查询)的函数   查询字符串标记数组。必需的。

这是什么意思?有人可以帮忙告诉我更多关于它的信息,以便我更好地理解吗?

2 个答案:

答案 0 :(得分:7)

我在这里找到了一些有用的信息:

https://github.com/twitter/typeahead.js/blob/master/doc/migration/0.10.0.md#tokenization-methods-must-be-provided

  

最常见的标记化方法在空格或非字字符上拆分给定的字符串。 Bloodhound为开箱即用的方法提供了实现:

  // returns ['one', 'two', 'twenty-five']
  Bloodhound.tokenizers.whitespace('  one two  twenty-five');

  // returns ['one', 'two', 'twenty', 'five']
  Bloodhound.tokenizers.nonword('  one two  twenty-five');
     

对于查询标记化,您可能希望使用上述方法之一。对于基准标记化,您可能希望做一些更高级的事情。

     

对于基准,有时您希望从多个属性中删除令牌。例如,如果您正在为GitHub存储库构建搜索引擎,那么从repo的名称,所有者和主要语言派生的令牌可能是明智的:

  var repos = [
    { name: 'example', owner: 'John Doe', language: 'JavaScript' },
    { name: 'another example', owner: 'Joe Doe', language: 'Scala' }
  ];

  function customTokenizer(datum) {
    var nameTokens = Bloodhound.tokenizers.whitespace(datum.name);
    var ownerTokens = Bloodhound.tokenizers.whitespace(datum.owner);
    var languageTokens = Bloodhound.tokenizers.whitespace(datum.language);

    return nameTokens.concat(ownerTokens).concat(languageTokens);
  }
     

可能还有一种情况是您希望在后端执行基准标记化。最好的方法是只在属性中添加一个包含这些标记的属性。然后,您可以提供只返回已存在的标记的标记生成器:

  var sports = [
    { value: 'football', tokens: ['football', 'pigskin'] },
    { value: 'basketball', tokens: ['basketball', 'bball'] }
  ];

  function customTokenizer(datum) { return datum.tokens; }
     

还有很多其他方法可以用来标记基准,这实际上取决于你想要实现的目标。

似乎不幸的是,从主要文档中找不到这些信息。

答案 1 :(得分:1)

它是用于将数据或查询拆分为单词数组以执行搜索/匹配的标记。 datumTokenizer引用你的数据,queryTokenizer引用所做的查询(通常是在输入中输入的文本)。

如果您的数据是一个对象数组(即json),则datumTokenizer允许您指定要对其执行搜索的对象的哪个字段。例如,如果要搜索名称和代码字段,可以输入Bloodhound.tokenizers.obj.whitespace(['name','code'])之类的内容或提供自定义函数。

您可以在以下网址找到更多信息:https://github.com/twitter/typeahead.js/blob/master/doc/migration/0.10.0.md#tokenization-methods-must-be-provided