如何使用CouchDB构建“标记”支持?

时间:2008-10-17 04:57:23

标签: python couchdb tagging document-oriented-db

我正在使用以下视图函数迭代数据库中的所有项目(以便查找标记),但我认为如果数据集很大,性能非常差。 还有其他方法吗?

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 个答案:

答案 0 :(得分:7)

免责声明:我没有对此进行测试,也不知道它是否可以表现得更好。

创建单个烫发视图:

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结构会略有不同,但您仍会获得发布日期排序。

答案 1 :(得分:3)

您可以定义一个永久性视图,正如Bahadir建议的那样。但是,在进行此类索引时,输出每个键的文档。而是发出([tag,doc.published],null)。在当前版本中,您必须为每个文档单独查找,但SVN主干现在支持在查询字符串中指定“include_docs = True”,而CouchDB会自动将文档合并到您的视图中,而不是空间开销。

答案 2 :(得分:1)

你的观点非常正确。一系列的想法:

视图生成是增量的。如果您的阅读流量大于您的写入流量,那么您的观点根本不会引起问题。关注这一点的人通常不应该这样。参考框架,如果您在没有更新的情况下将数百条记录转储到视图中,您应该担心。

发送整个文档会减慢速度。您应该只发出使用视图所需的内容。

不确定val ==“%s”的性能是什么,但你不应该过度思考。如果有标签数组,您应该发出标签。如果你期望一个包含非字符串的标签数组,那么请忽略它。

答案 3 :(得分: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 map函数返回带有“key”中每个唯一标记的数据,然后是value中带有该标记的每个帖子,所以当你抓住key =“mytag”时,它将检索所有帖子标记“mytag”。

我已经针对大约10个条目对其进行了测试,并且每个查询似乎需要大约0.0025秒,不确定大数据集的效率是多少。