2011-04-21 54 views
2

我在GAE应用程序中有以下模型。关于GAE数据存储区的索引

class User 
    school_name = db.StringProperty(Indexed=True) 
    country = db.StringProperty(Indexed=True) 
    city = db.StringProperty(Indexed=True) 
    sex = db.StringProperty(Indexed=True) 
    profession = db.StringProperty(Indexed=True) 
    joined_date = db.DateTimeProperty(Indexed=True) 

而我想通过这些字段的组合来过滤用户。过滤器的结果应该首先显示最近加入的用户。所以这意味着任何查询以命令操作结束,我想。这样的:

User.all().filter('country =','US').filter('profession =','SE').order('-joined_date') 
User.all().filter('school_name =','AAA').filter('profession =','SE').order('-joined_date') 
.... 
User.all().filter('sex =','Female').filter('profession =','HR').order('-joined_date') 

所有这些字段组合是C(5,1)+ C(5,2)+ ... + C(5,5)= 31

我的问题是要实现它,是否需要为Google AppEngine中的所有这些情况(31)创建索引。或者你可以建议其他方式来实现它?

注:在C(n,k)是组合公式,多见于http://en.wikipedia.org/wiki/Combination

提前感谢!

+1

您所描述的问题称为“爆炸索引”。下面的尼克对你有一些很好的建议。 – 2011-04-21 11:54:35

+0

谢谢贾斯汀,现在我知道它被称为'爆炸索引' – Nyambaa 2011-04-21 12:16:02

回答

4

您有几种选择:

  1. 创建31个指标,按照你的建议。
  2. 在内存中进行排序。如果没有排序顺序,所有的查询都可以使用内置的合并连接策略执行,所以你根本不需要任何索引。
  3. 将查询限制为更有可能的查询或那些消除大部分不匹配结果的查询,并在内存中执行额外的过滤。
  4. 将所有数据都放在ListProperty中,作为“key:value”字符串进行索引,并仅对其进行过滤。您需要在该字段上创建多个具有不同出现次数的索引(例如,对其索引一次,两次等),并且会导致相同数量的索引条目,但使用的自定义索引更少。