2012-01-10 54 views
2

说我有,看起来实体有点像这样:谷歌应用程序引擎 - 关键字搜索+排序的其他属性

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') 

排序无效。我知道为什么 - 文件明确表示,这是不可能的,使用了多值属性平等过滤器时,该排序顺序将被忽略(从谷歌文档):

的一个重要警告是既具有平等查询过滤器和多值属性上的排序顺序。在这些查询中,排序 订单被忽略。对于单值属性,这是一个简单的 优化。每个结果都将具有相同的属性值, 因此结果不需要进一步排序。但是,多值 属性可能具有其他值。由于忽略排序顺序为 ,因此与应用排序顺序相比,查询结果可能以不同的顺序返回 。 (恢复下降排序顺序 将是昂贵的,并且需要额外的指标,而这个用例是 罕见,所以查询规划离开它关闭。)

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

感谢您的提示!

+0

如果全文检索是你是什么之后,你可能想上申请到委托人的测试人员计划为新的API:https://docs.google.com/a/google.com/spreadsheet/viewform?formkey= dEdWcnRJUXZ2VGR3YmVsT1Q1WVB2Smc6MQ – proppy 2012-01-10 10:38:47

回答

1

而不是做前缀匹配,适当记号化,茎和规范你的字符串,并在其上做相等比较。

+0

这最终成为最简单的方法,并且运作良好。 – 2012-01-11 03:21:39

2

解决方法1: 应用所产生的关键词算法,那么你就不用做了对比查找。

解决方法2: 存放在单独的实体组(“表”)中的所有唯一关键字。从这个组中找到符合您标准的关键字。然后用keywords IN [kw1, kw2, ...]进行查询。确保匹配关键字的数量不是太大,例如,你可以只选择第一10

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

解决方法4:使用 为IndexTank全文本搜索,或者申请@proppy提及的“Trusted Tester Program”。

+0

+1我会去没有2. – 2012-01-10 14:26:57