Typeahead/Bloodhound: Удаление дубликатов из локального

Мне непонятно, как удалить дубликаты с помощью параметра dupDetector в Bloodhound.

Я использую версию 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 или английскому языку, и набор результатов показывает только одно имя здания, поскольку это имя здания одинаково для всех трех результатов. В настоящее время он возвращает все три записи в списке.

Это возможно?

Вся информация, которую я смог найти о dupDetector, сводилась к сравнению удаленной и предварительной выборки. Я использую только один источник данных, у него просто несколько записей с одинаковым именем.


person Carey Estes    schedule 28.10.2015    source источник
comment
вы на правильном пути, вы пробовали return remoteMatch.name === localMatch.name вместо building_name?   -  person gmaniac    schedule 09.11.2015
comment
Что? Нет атрибута с названием имени   -  person Xogle    schedule 10.11.2015


Ответы (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;
  }
});
person Xogle    schedule 09.11.2015
comment
Итак, если dupDtector не работает для локальных выборок, значит ли это, что у меня есть только один вариант — отредактировать мою локальную базу данных? Есть ли способ проанализировать возвращаемый объект Bloodhound до того, как он попадет в набор результатов? Думаю, я мог бы написать цикл для удаления дубликатов. - person Carey Estes; 10.11.2015
comment
Почему бы вам просто не предварительно загрузить его локально в файл JSON. Теоретически должно работать. - person Xogle; 10.11.2015
comment
Ну, я изначально делал это, но решил переключиться на локальную выборку, так как мне нужно построить и запустить file_put_contents, когда запрашивается и запускается БД. Я попробую. - person Carey Estes; 10.11.2015