У меня есть база данных документов, помеченных ключевыми словами. Я пытаюсь найти (а затем подсчитать) уникальные теги, которые используются рядом друг с другом. Итак, для любого данного тега я хочу знать, какие теги использовались вместе с этим тегом.
Например, если бы у меня был один документ с тегами [fruit, apple, plant]
, то при запросе [apple]
я должен получить [fruit, plant]
. Если в другом документе есть теги [apple, banana]
, то мой запрос для [apple]
вместо этого даст мне [fruit, plant, banana]
.
Это моя функция карты, которая выдает все теги и их соседей:
function(doc) {
if(doc.tags) {
doc.tags.forEach(function(tag1) {
doc.tags.forEach(function(tag2) {
emit(tag1, tag2);
});
});
}
}
Итак, в моем примере выше он будет излучать
apple -- fruit
apple -- plant
apple -- banana
fruit -- apple
fruit -- plant
...
Мой вопрос: какой должна быть моя функция сокращения? Функция сокращения должна по существу отфильтровывать дубликаты и группировать их все вместе.
Я пробовал несколько разных попыток, но мой сервер базы данных (CouchDB) продолжает выдавать ошибку: reduce_overflow_error. Сокращение объема производства должно сокращаться быстрее.
EDIT: я нашел что-то, что работает, но я не уверен, почему. Я вижу, что есть необязательный параметр "rereduce" для вызова функции сокращения. Если я проигнорирую эти особые случаи, то он перестанет выдавать reduce_overflow_errors. Кто-нибудь может объяснить, почему? И еще, должен ли я просто игнорировать их, или это потом укусит меня за задницу?
function(keys, values, rereduce) {
if(rereduce) return null; // Throws error without this.
var a = [];
values.forEach(function(tag) {
if(a.indexOf(tag) < 0) a.push(tag);
});
return a;
}
if(rereduce) return null
вы выбрасываете часть данных в унитаз. - person Marcello Nuccio   schedule 03.05.2012