1

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

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

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

设计决策:

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

障碍(即最后的堡垒):我觉得剩下的唯一问题是当我有一个过滤标准(例如,名称以“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);

我以为这会回来:

  • 汤姆2 18
  • 汤姆1 20

不幸的是,这会返回

  • 汤姆1 20
  • 汤姆2 18

因为查询首先按名称过滤,然后按年龄作为辅助键。

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

欢迎任何想法。

谢谢, 马蒂亚斯

4

2 回答 2

2

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

如果您为名称创建索引,您应该能够使用(未记录的)“~”运算符进行词干匹配。有人提到它将在下一个版本中由 Google(我相信)的某个人在GAE Full Text Search API 短语匹配中记录

If you put the entity id into the text index, you'd have a list of entities containing that name stem and then couldn't you filter by a list of keys and sort by age.

Shawn

UPDATE: Now that the docs are released I see the "~" operator is NOT stem matching but rather merely plurals

To search for plural variants of an exact query, use the ~ operator: ~"car" # searches for "car" and "cars"

于 2012-06-20T22:16:43.063 回答
1

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

我会尝试通过您的 UI 或通过非规范化数据存储区中的名称字段来找出如何避免不等式过滤器的方法。

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

于 2012-06-20T19:58:25.053 回答