4

次のビュー関数を使用して、データベース内のすべてのアイテムを反復処理しています (タグを見つけるため) が、データセットが大きい場合、パフォーマンスが非常に悪いと思います。他のアプローチはありますか?

def by_tag(tag):
return  '''
        function(doc) {
            if (doc.tags.length > 0) {
                for (var tag in doc.tags) {
                    if (doc.tags[tag] == "%s") {
                        emit(doc.published, doc)
                    }
                }
            }
        };
        ''' % tag
4

4 に答える 4

7

免責事項: 私はこれをテストしていないので、パフォーマンスが向上するかどうかはわかりません。

パーマ ビューを 1 つ作成します。

function(doc) {
  for (var tag in doc.tags) {
    emit([tag, doc.published], doc)
  }
};

_view/your_view/all?startkey=['your_tag_here']&endkey=['your_tag_here', {}] でクエリします

結果の JSON 構造はわずかに異なりますが、公開日のソートは引き続き得られます。

于 2008-10-17T17:48:37.340 に答える
3

Bahadir が示唆するように、単一の永続的なビューを定義できます。ただし、この種のインデックス作成を行うときは、各キーのドキュメントを出力しないでください。代わりに、emit([tag, doc.published], null) を使用します。現在のリリース バージョンでは、ドキュメントごとに個別のルックアップを行う必要がありますが、SVN トランクは現在、クエリ文字列で「include_docs=True」を指定することをサポートしており、CouchDB は自動的にドキュメントをビューにマージします。スペースオーバーヘッド。

于 2008-10-19T15:34:37.657 に答える
1

あなたはその見方で非常に正しい軌道に乗っています。ただし、考えのリスト:

ビューの生成はインクリメンタルです。読み取りトラフィックが書き込みトラフィックよりも多い場合、ビューはまったく問題を引き起こしません。これを気にする人は一般的に気にする必要はありません。参考までに、何百ものレコードを更新せずにビューにダンプしている場合は心配する必要があります。

ドキュメント全体を発行すると、処理が遅くなります。ビューの使用に必要なものだけを発行する必要があります。

val == "%s" のパフォーマンスがどうなるかはわかりませんが、考えすぎないでください。タグ配列がある場合は、タグを発行する必要があります。非文字列を含むタグ配列が予想される場合は許可されますが、これは無視してください。

于 2008-10-17T05:15:36.207 に答える
0
# Works on CouchDB 0.8.0
from couchdb import Server # http://code.google.com/p/couchdb-python/

byTag = """
function(doc) {
if (doc.type == 'post' && doc.tags) {
    doc.tags.forEach(function(tag) {
        emit(tag, doc);
    });
}
}
"""

def findPostsByTag(self, tag):
    server = Server("http://localhost:1234")
    db = server['my_table']
    return [row for row in db.query(byTag, key = tag)]

byTag マップ関数は、「キー」に一意の各タグを含むデータを返し、次にそのタグを含む各投稿を に返すvalueため、キー = 「mytag」を取得すると、タグ「mytag」を持つすべての投稿が取得されます。

約 10 のエントリに対してテストしたところ、クエリごとに約 0.0025 秒かかるようですが、大規模なデータ セットでどれほど効率的かはわかりません..

于 2008-11-23T05:53:49.217 に答える