Google App Engine - 关键字搜索+其他媒体资源的订购

时间:2012-01-10 10:08:21

标签: google-app-engine

假设我有一个看起来有点像这样的实体:

class MyEntity(db.Model):
    keywords            = db.StringListProperty()
    sortProp            = db.FloatProperty()

我有一个过滤器可以执行关键字搜索:

query = MyEntity.all()\
                .filter('keywords >=', unicode(kWord))\
                .filter('keywords <',  unicode(kWord) + u"\ufffd")\
                .order('keywords')

哪个效果很好。我遇到的问题是,如果我尝试使用'sortProp'订购它:

                .order('sortProp')

订购无效。我明白了为什么 - 文档明确说明这是不可能的,并且当使用具有多值属性的相等过滤器(来自Google文档)时,将忽略排序顺序:

  

一个重要的警告是同时使用相等过滤器和a的查询   对多值属性进行排序。在那些查询中,排序   订单被忽视。对于单值属性,这很简单   优化。每个结果都具有相同的属性值,   所以结果不需要进一步分类。但是,多值   属性可能有其他值。由于排序顺序是   忽略,查询结果可能以不同的顺序返回   比如果应用排序顺序。 (恢复丢弃的排序顺序   这将是昂贵的,需要额外的索引,这个用例是   很少见,因此查询规划器将其关闭。)

我的问题是:有没有人知道这方面有一个好的解决方法?是否有更好的方法来进行关键字搜索以绕过此限制?我真的想结合使用关键字和其他属性的订购。我能想到的唯一解决方案是在查询后对列表进行排序,但是如果我这样做,我将失去偏移到查询中的能力,如果数据集很大,我甚至可能无法获得具有最高排序顺序的结果。 / p>

感谢您的提示!

2 个答案:

答案 0 :(得分:2)

解决方法1: 对关键字应用词干算法,然后您不需要进行比较查找。

解决方法2: 将所有唯一关键字存储在单独的实体组(“表”)中。从该组中查找符合您条件的关键字。然后使用keywords IN [kw1, kw2, ...]进行查询。确保匹配关键字的数量不是太大,例如,您只能选择前10个。

解决方法3: 重新排列应用程序端的项目列表

解决方法4: 使用IndexTank进行全文搜索,或申请@proppy所述的“受信任的测试人员计划”。

答案 1 :(得分:1)

而不是进行前缀匹配,正确地标记,阻止和规范化字符串,并对它们进行相等比较。