【发布时间】:2011-05-24 09:01:58
【问题描述】:
我正在开发一个简单的博客/书签平台,我正在尝试添加一个 tags-explorer/drill-down 功能,一个 là delicious 以允许用户过滤指定一个特定标签列表。
类似这样的:
使用此简化模型在数据存储中表示帖子:
class Post(db.Model):
title = db.StringProperty(required = True)
link = db.LinkProperty(required = True)
description = db.StringProperty(required = True)
tags = db.ListProperty(str)
created = db.DateTimeProperty(required = True, auto_now_add = True)
帖子的标签存储在ListProperty 中,为了检索带有特定标签列表的帖子列表,帖子模型公开了以下静态方法:
@staticmethod
def get_posts(limit, offset, tags_filter = []):
posts = Post.all()
for tag in tags_filter:
if tag:
posts.filter('tags', tag)
return posts.fetch(limit = limit, offset = offset)
这很好用,虽然我没有过分强调它。
当我尝试向get_posts 方法添加“排序”顺序以保持结果按"-created" 日期排序时,问题就出现了:
@staticmethod
def get_posts(limit, offset, tags_filter = []):
posts = Post.all()
for tag in tags_filter:
if tag:
posts.filter('tags', tag)
posts.order("-created")
return posts.fetch(limit = limit, offset = offset)
排序顺序为每个要过滤的标签添加一个索引,导致可怕的爆炸索引问题。
最后一件让这件事变得更复杂的事情是get_posts 方法应该提供一些分页机制。
你知道解决这个问题的任何策略/想法/解决方法/Hack吗?
【问题讨论】:
标签: python google-app-engine indexing google-cloud-datastore explode