【问题标题】:Typeahead/Bloodhound: Removing duplicates from localTypeahead/Bloodhound:从本地删除重复项
【发布时间】:2015-10-28 17:39:37
【问题描述】:

我不清楚如何使用 Bloodhound 中的 dupDetector 参数删除重复项。

我正在使用 v. 0.11.1

从具有如下记录的数据库中提取数据集:

building_name  room  department
Rooney         123   English
Rooney         456   Chemistry
Rooney         987   Chemistry
Meyer          65    Dog Walking
Flatiron       498   Weaving

我的寻血猎犬电话:

var buildingName = new Bloodhound({
      datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name', 'room', 'department'),
      queryTokenizer: Bloodhound.tokenizers.whitespace,
      local: buildingJson,
      dupDetector: function(remoteMatch, localMatch) {
        return remoteMatch.building_name === localMatch.building_name;
      }
});

我正在寻找的功能是能够搜索鲁尼、456 或英语,结果集仅显示一个 building_name,因为该建筑物名称对于所有三个结果都是相同的。目前,它正在返回列表中的所有三个记录。

这可能吗?

我能找到的关于 dupDetector 的所有信息都是比较远程和预取。我只使用一个数据源,它只有多个同名记录。

【问题讨论】:

  • 你在正确的道路上,你试过return remoteMatch.name === localMatch.name而不是building_name吗?
  • 什么?没有标记为“名称”的属性

标签: typeahead.js twitter-typeahead bloodhound


【解决方案1】:

很遗憾,dupDetector 仅适用于远程或预取数据源。

本地数据源存在问题,因此您的 dupDetector 无法正常工作。它永远不会被调用。尝试使用 console.log 来查看。

https://github.com/twitter/typeahead.js/issues/606#issuecomment-51221195

看起来您无论如何都是从 JSON 加载的,所以为什么不直接将它弹出到您的“本地”服务器并“预取”它呢。否则看起来你必须手动完成。

var buildingName = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name', 'room', 'department'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    prefetch: ../buildingJson.json,
    dupDetector: function(remoteMatch, localMatch) {
        return remoteMatch.building_name === localMatch.building_name;
  }
});

【讨论】:

  • 好的,所以如果 dupDtector 无法进行本地提取,这是否意味着我唯一的选择是编辑我的本地数据库?有没有办法在 Bloodhound 返回对象进入结果集之前对其进行解析?我想我可以写一个循环来删除重复项。
  • 为什么不直接在 JSON 文件中“本地”“预取”它。它理论上应该有效。
  • 嗯,我最初是这样做的,但我决定切换到本地提取,因为当查询和运行数据库时,我需要构建和运行 file_put_contents。我试试看。
猜你喜欢
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多