2016-02-18 72 views
0

目前我想查詢位置的實體,由兩個範圍過濾器,限制緯度和經度當前視圖過濾。谷歌數據存儲:查詢隨機實體過濾

查詢應該在隨機分佈返回實體的數量有限。按原樣查詢返回按緯度排序的集合。

Location Entity: Latitude, Longitude, ... 

我的方法迄今如下:我介紹了一個隨機key屬性即類型的雙並且具有範圍[0 ... 1]。我將它存儲在每個位置實體的數據存儲,並嘗試通過該屬性進行排序:

Location Entity: Latitude, Longitude, ..., randomKey 

但在執行此查詢後:

Query query = new Query("Location"); 
query.addSort("randomKey", Query.SortDirection.ASCENDING); 
query.setFilter(latitudeRangeFilter); 
query.setFilter(longitudeRangeFilter); 

我得到一個拋出:IllegalArgumentException:

java.lang.IllegalArgumentException: The first sort property must be the same as the property to which the inequality filter is applied. In your query the first sort property is randkey but the inequality filter is on longitude 

有人可以給我一個關於如何進行的建議嗎?我的方法是對的還是有更好的方法?

在此先感謝!

回答

2

您的查詢是不會因爲你在兩個不同的屬性中指定不等式過濾工作。您可能需要使用GeoSpacial query

至於隨機性,它可能更容易在指定範圍內檢索所有實體,然後隨機選擇你需要的結果的數量。

如果位置數量可管理,您可能希望將它們全部保存在memcache中作爲列表,而不是每次查詢數據存儲。然後您可以遍歷該列表以獲取結果,這將非常有用快速且不會造成閱讀成本。

+0

謝謝!您的答案幫了我很多:將座標存儲爲GeoSpacial類型自動解決了我的問題。通過應用矩形過濾器,我得到了位置的隨機分佈。 – alexanderb14

+0

無論如何,這個功能只是一個alpha版本,所以我不能在app engine/production上使用它。如果沒有GeoSpacial,你有什麼想法可以實現嗎?我有一個huuge組數據,10K +的,所以我不希望查詢所有 – alexanderb14

+0

10K +是一個小數據集:)如果你存儲長,緯度和ID,他們都會很容易融入一個單一的內存緩存的實體。因此,這可能是最便宜的解決方案:直到memcache重置爲止,全部檢索並使用(無查詢),這並不經常發生。 –

相關問題