2011-10-31 79 views

回答

2

當您存儲它時,爲每個實體分配一個介於0和1之間的隨機數。要獲取隨機記錄,請生成另一個介於0和1之間的隨機數,然後查詢隨機值大於此值的最小實體。

+0

不是一個壞主意,儘管它聽起來像我會創建一個索引僅僅是爲了選擇數據,這似乎是不幸的。我的表只會很少更新,所以我在考慮本地緩存鍵列表,然後隨機抓取一個鍵(避免額外的列/索引/查詢)。 –

0

您不需要全部取回。 例如:

  1. countall =查詢(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. 最後一個ID是你的... (平均你混帳50%或以免首先讀取平均爲50%以下)

改進(以在緩存中有更小的關鍵表)!

第一次閱讀後記住每個X元素。 Cache id -s及其位置。因此,下一次從選定ID進一步查詢條件(max「.limit(rnd%X)」將爲X-1)。

隨機只是隨機的,如果它不需要接近100%公平,推測慢性字段值(例如,如果您在10天內有1000條記錄,對於隨機501選擇第二個元素大於第五天) 。

其他選項,如果你有慢性場日期(或類似),取比隨機日期和年輕然後隨機日期+ 1(你需要知道的第一個日期和最後日期),舊的元素。第二次在取出的記錄之間選擇隨機數如果查詢爲空選擇比等更大......

0

this post引用有關從物化數據存儲選擇一些隨機因素:

如果你的ID是連續的,一個辦法是隨機選擇5 號來自已知使用的id範圍。然後使用「in」filter()中的 查詢。

如果您不介意5個條目相鄰,您可以使用count(), limit()和offset()來隨機查找包含5個條目的塊。

否則,你可能需要使用限制(和偏移量),以 同時隨機選擇一個條目出來。

- 喬希

0

我非常適應提供Matejc的算法。然而,3件事情:

  1. 除了使用COUNT()或數據存儲服務工廠(DatastoreServiceFactory.getDatastoreService()),我有一個跟蹤我感興趣的實體總數的實體這種方法的原因是: a。b。在處理大量對象時,count()可能很昂貴。您不能在本地測試數據存儲服務工廠...在prod中進行測試只是一種不好的做法。

  2. 生成隨機數:ThreadLocalRandom.current()nextLong(1,maxRange)

  3. 而不是使用限制(),我使用偏移,所以我不擔心「排序。 「