キーワードでタグ付けされたドキュメントのデータベースがあります。一緒に使用されている一意のタグを見つけようとしています(そして数えようとしています)。したがって、特定のタグについて、そのタグと一緒に使用されているタグを知りたいと思います。
たとえば、タグが付いたドキュメントが1つある場合、[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
...
私の質問は:私のreduce関数はどうあるべきですか?削減機能は、基本的に重複を除外し、それらをすべてグループ化する必要があります。
さまざまな試行を試みましたが、データベースサーバー(CouchDB)からエラーが発生し続けます:reduce_overflow_error。削減出力はより急速に縮小する必要があります。
編集:うまくいくように見えるものを見つけましたが、理由はわかりません。reduce関数呼び出しにオプションの「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;
}