在Google应用引擎(GAE)中进行分页

时间:2012-06-20 19:51:28

标签: google-app-engine paging

过去几天我花了很多时间试图弄清楚如何在Google App Engine中进行正确的分页。一旦我有一个可行的解决方案,我会在谷歌代码上打开这些东西,因为我看到很多人都在努力解决这个问题。

目标:为GAE创建一个简单但功能强大的分页解决方案,具有以下功能:

  • 向前和向后分页,支持第一页和最后一页
  • 按字段(子集)排序(一次只能一个订单)
  • 以类似方式拥有过滤条件(例如,输入'Tom'将过滤并仅显示名称以'Tom'开头的人)
  • 跟踪总页数

设计决定:

  • 不要使用限制/偏移,因为它不会缩放。而是依赖游标
  • 使用分片来保持更新的总页数
  • 接受妥协,但旨在获得最佳性能/可扩展性

障碍物(即最后堡垒): 我觉得唯一的问题是我有一个过滤条件(例如名称以'Tom'开头)和不同属性的排序标准。

e.g。人[姓名,年龄]

  • 按名称'Tom *'
  • 过滤
  • 按年龄排序

阅读文档,我以为我找到了解决方案:

Query q = new Query("Person");
q.addFilter("name", FilterOperator.GREATER_THAN_OR_EQUAL, nameFilter);
q.addFilter("name", FilterOperator.LESS_THEN, nameFilter + "\uFFFD");
q.addSort("name", SortDirection.ASCENDING);
q.addSort("age", SortDirection.ASCENDING);

我以为这会回来:

  • Tom2 18
  • Tom1 20

不幸的是,这会返回

  • Tom1 20
  • Tom2 18

首先按名称筛选查询,然后按年龄作为辅助密钥进行筛选。

我能想到的唯一解决方案是将整个过滤结果放入Java结构中,使用比较器进行排序,然后选择我想要显示的记录。但这有一个额外的问题,我的光标逻辑消失了。这有点意味着我有2条逻辑路径来解决分页。这可能是最终的解决方案,但我想知道是否有人更聪明有更好的想法。

欢迎任何想法。

谢谢, 马加什

2 个答案:

答案 0 :(得分:2)

我怀疑你可能想要查看全文搜索。 http://googleappengine.blogspot.jp/2012/05/looking-for-search-find-it-on-google.html

如果为name创建索引,则应该能够使用(未记录的)'〜'运算符来进行词干匹配。有人提到它将在下一个版本中由Google的某个人(我相信)在此处记录GAE Full Text Search API phrase matching

如果您将实体ID放入文本索引中,您将拥有一个包含该名称词干的实体列表,然后您无法按键列表进行过滤并按年龄排序。

肖恩

更新:既然文档被释放了,我看到“〜”运算符不是词干匹配而是仅仅是复数

  

要搜索精确查询的多个变体,请使用〜运算符:   〜“car”#搜索“car”和“cars”

答案 1 :(得分:1)

首先建议不要在名称上使用不等式过滤器。如果您必须使用不等式过滤器,那么您是对的,您必须按名称排序,然后按年龄排序。哪个,是的,真的很糟糕,因为如果你想要翻页,你需要整个结果然后排序并弄清楚如何翻页。

我试图通过您的UI或通过对数据存储区中的名称字段进行非规范化来弄清楚如何避免不等式过滤器。

我真的不知道为什么你会有Tom1和Tom2,但如果你知道你会有一堆Toms,你可能有一个name_base字段只存储“Tom”,那么你可以获取所有没有不平等的汤姆斯。