从Objectify实体获取随机条目

时间:2011-10-31 18:01:17

标签: google-app-engine objectify

如何使用Objectify从Google App Engine数据存储中获取随机元素?我应该获取所有实体的密钥并从中随机选择还是有更好的方法?

4 个答案:

答案 0 :(得分:2)

存储时,为每个实体分配0到1之间的随机数。要获取随机记录,请生成0到1之间的另一个随机数,并查询具有大于该值的随机值的最小实体。

答案 1 :(得分:0)

您无需取全部内容。 例如:

  1. countall = query(X.class).count() // http://groups.google.com/group/objectify-appengine/browse_frm/thread/3678cf34bb15d34d/82298e615691d6c5?lnk=gst&q=count#82298e615691d6c5
  2. rnd =生成随机数[0..countall]
  3. ofy.query(X.class).order(“ - date”)。limit(rnd); //例如-date或一些慢性索引字段
  4. 最后一个是你的... (平均而言,你可以获得50%或者至少第一次阅读平均减少50%)
  5. 改进(在缓存中使用较小的密钥表)!

    首次阅读后记住每个X元素。 缓存id-s及其位置。因此,下次从所选id进一步查询条件(max“.limit(rnd%X)”将为X-1)。

    随机只是随机的,如果它不需要接近100%公平,推测慢性字段值(例如,如果您在10天内有1000条记录,则随机501选择第二元素大于第五天)。

    其他选项,如果您有慢性字段日期(或类似),则获取比随机日期更早的元素,然后使用更年轻的随机日期+ 1(您需要知道第一个日期和最后日期)。第二个在提取的记录之间选择随机。如果查询为空,请选择大于等...

答案 2 :(得分:0)

引自this post关于从Objectified数据存储中选择一些随机元素:

  

如果你的id是顺序的,一种方法是随机选择5   已知正在使用的id范围内的数字。然后使用带有的查询   “in”filter()。

     

如果你不介意相邻的5个条目,你可以使用count(),   limit()和offset()随机查找5个条目的块。

     

否则,您可能需要使用limit()和offset()来   随机选择一个条目。

     

- 乔希

答案 3 :(得分:0)

我几乎适应了Matejc提供的算法。但是,有三件事:

  1. 我没有使用count()或数据存储区服务工厂(DatastoreServiceFactory.getDatastoreService()),而是有一个实体来跟踪我感兴趣的实体的总数。这种方法的原因就是它: 一个。当你处理很多对象时,count()可能会很昂贵 湾您无法在本地测试数据存储区服务工厂...在prod中进行测试只是一种不好的做法。

  2. 生成随机数:ThreadLocalRandom.current()。nextLong(1,maxRange)

  3. 我没有使用limit(),而是使用offset,所以我不必担心“排序”。