ビルド方法“タグ付け” CouchDBの使用をサポートしていますか?

StackOverflow https://stackoverflow.com/questions/211118

質問

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

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
役に立ちましたか?

解決

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

単一のパーマビューを作成します:

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構造はわずかに異なりますが、公開日の並べ替えを取得できます。

他のヒント

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

あなたは、ビューのある正しい軌道に乗っています。考えのリスト:

ビューの生成は増分です。読み取りトラフィックが書き込みトラフィックよりも多い場合、ビューは問題を引き起こしません。これを心配している人は、一般的にそうすべきではありません。参照フレーム。更新せずに何百ものレコードをビューにダンプする場合は心配する必要があります。

ドキュメント全体を送信すると、処理が遅くなります。ビューの使用に必要なもののみを出力する必要があります。

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

# 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マップ関数は、" key"に一意の各タグを含むデータを返し、次に value にそのタグを含む各投稿を返します。したがって、key =" mytag"を取得すると、タグ「mytag」ですべての投稿を取得します。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top