【问题标题】:How to get entities near specific entity in Google App Engine Objectify?如何在 Google App Engine Objectify 中获取特定实体附近的实体?
【发布时间】:2013-12-29 10:57:54
【问题描述】:

假设我有 100.000 个 Foo 类型的实体。 Foo 有一个被索引的属性 bar。现在,对于特定的 Foo A,我希望在按条形对所有 Foo 进行排序时获得最接近 A 的 10 个 Foo。

问题是,我不想手动执行此操作,因为有 10 万多个实体,它会非常慢。

一个想法是像这样使用偏移量和限制:

ofy().load().type(Foo.class).order("-bar").offset(offset).limit(limit).list();

但这要求我知道我的 Foo A 的位置,而我不知道。

我对此有一个可行的解决方案,它是一个单独的实体,它只存储所有 Foos 的位置并每分钟更新一次该表。它变得非常慢并导致 OutOfMemoryError,所以我需要一些不同的东西。

有人想试试这个吗?

【问题讨论】:

  • 你是什么意思:'我想让 10 Foos 最接近 A'?它应该最接近哪个属性?酒吧?栏是数字还是文本?
  • 10 Foos 接近按 Bar desc 排序的 A。条是数字。获取按 Bar 排序的结果列表没有问题。
  • Offset 不会有帮助,因为它的 O(n),它需要通过 shole 'offset' 的索引条目数,它不能只是跳转到那个位置。
  • 查看数据存储的地理位置库,它们会做类似的事情来在地图中的二维中查找最近的点。

标签: google-app-engine objectify


【解决方案1】:

你可以这样做:

List<Foo> biger = ofy().load().type(Foo.class).filter("bar >=", A.getBar()).order("bar").limit(10).list();

List<Foo> lower = ofy().load().type(Foo.class).filter("bar <", A.getBar()).order("-bar").limit(10).list();

List<Foo> closest = getClosest(A, biger, lower);

【讨论】:

  • 这是一个聪明的解决方案!感谢那。只是一个小的修改:由于 query.limit(int) 的工作方式(它需要第一个 n),较大的列表需要更改为 List large = ofy().load().type(Foo.class ).filter("bar>=", A.getBar()).order("bar").limit(10).list();请注意,首先进行过滤,并且必须在此之后进行排序,并且以相反的顺序进行。这可能看起来不直观,但我只是通过测试确认了它。更改您的答案,我会接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
相关资源
最近更新 更多