2016-02-18 22 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重置为止,全部检索并使用(无查询),这并不经常发生。 –