1

システムで使用されている上位 10 個のタグを表示するビューを作成しようとしています。reduce 関数で _count を使用して量を取得するのはかなり簡単ですが、リストを数字で並べ替えるわけではありません。これを行う方法はありますか?

function(doc, meta) {
  if(doc.type === 'log') {
    emit(doc.tag, 1);
  }
}
_count

結果として、私は持っていたい:

  • タグ3 10
  • タグ1 7
  • タグ2 3
  • ...

それ以外の

  • タグ1 7
  • タグ2 3
  • タグ3 10

最も重要なことは、フルセットをアプリケーションサーバーに転送してそこで処理したくないということです。

4

2 に答える 2

2

カウチベースでは、リデュース中/リデュース後に結果を並べ替えることができないため、何かの「トップ 10」を直接取得することはできません。カウチベース ビューでは、値は常にキーでソートされます。最良の方法は次のとおりです。

  1. tag_name - count_valueキーと値のペアを返すビューをクエリします。tag_name
  2. N 分ごとに実行され、[1] から結果を取得して並べ替え、並べ替えた結果を個別のキー (つまり、"Top10Tags") に書き込むジョブを作成します。
  3. アプリで、主要な Top10Tags をクエリします。

これによりトラフィックが減少する可能性がありますが、結果が古くなっている可能性があります。また、couchbase が実行されている同じサーバーでその「ジョブ」を作成することもできます (つまり、小さな node.js アプリなどを作成します)。これは、ループバック トラフィックと、N 分ごとにソートするための小さな CPU 量だけを消費します。

また、_count reduce 関数を使用している場合は、数値を発行する必要はなく、null のみを使用してください。

function(doc, meta) {
  if(meta.type === "json" && doc.type === 'log') {
    emit(doc.tag, null);
  }
}

そして、次のような複数のタグでタグ付けされたドキュメントが必要な場合

{
  "type": "log",
  "tags": ["tag1","tag2","tag3"]
}

マップ関数は次のようにする必要があります。

function(doc, meta) {
  if(meta.type === "json" && doc.type === 'log') {
    for(var i = 0; i < doc.tags.length; i++){
      emit(doc.tags[i], null);
    }
  }
}

そのトップ10リストについてもう1つ。ディスクに保存したくない場合は、memcache バケットに保存できます。

于 2013-04-12T13:24:46.807 に答える
0

簡単だと思っていても、実際にはそうではないこと。

couchdb では、リスト関数を使用し、JavaScript の sort() で結果を並べ替えます。そうすれば、すべてがサーバー側でソートされ、リストに上位 10 のみを返すことができます。

大規模なデータセットではこれが遅くなることを心に留めておいてください。

于 2013-04-12T04:33:08.577 に答える