Google app engine Google数据存储:使用过滤器查询随机实体

Google app engine Google数据存储:使用过滤器查询随机实体,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,目前,我正在尝试查询位置实体,通过两个范围过滤器进行过滤,将纬度和经度限制为当前视图 该查询应该以随机分布返回有限数量的实体。按原样查询返回按纬度排序的集合 Location Entity: Latitude, Longitude, ... 到目前为止,我的方法如下:我引入了一个类型为double的randomKey属性,其范围为[0…1]。我将其与每个位置实体一起存储在数据存储中,并尝试按该属性排序: Location Entity: Latitude, Longitude, ..., ra

目前,我正在尝试查询位置实体,通过两个范围过滤器进行过滤,将纬度和经度限制为当前视图

该查询应该以随机分布返回有限数量的实体。按原样查询返回按纬度排序的集合

Location Entity: Latitude, Longitude, ...
到目前为止,我的方法如下:我引入了一个类型为double的randomKey属性,其范围为[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
有人能给我一个如何进行的建议吗?我的方法是正确的还是有更好的方法


提前谢谢

您的查询无法运行,因为您在两个不同的属性上指定了不等式筛选器。您可能需要使用

至于随机性,可能更容易检索指定范围内的所有实体,然后随机选择所需的结果数


如果位置的数量是可管理的,您可能希望将所有位置作为列表保存在memcache中,而不是每次都查询数据存储。然后您可以迭代该列表以获得结果,这将非常快并且不会产生读取成本。

您的查询无法运行,因为您在两个不同的属性上指定了不等式过滤器。您可能需要使用

至于随机性,可能更容易检索指定范围内的所有实体,然后随机选择所需的结果数


如果位置的数量是可管理的,您可能希望将所有位置作为列表保存在memcache中,而不是每次都查询数据存储。然后您可以迭代该列表以获得结果,这将非常快,并且不会产生读取成本。

谢谢!您的回答对我帮助很大:将坐标存储为GeoSpacial类型自动解决了我的问题。通过应用矩形过滤器,我得到了一个随机分布的位置。无论如何,这个功能只是一个alpha版本,所以我不能在appengine服务器/产品上使用它。你知道没有地球空间我怎么能实现这一点吗?我有一组huuge数据,10k+,所以我不想查询所有10k+是一个小数据集:)如果存储long、lat和ID,它们将很容易地放入单个memcache实体中。因此,这可能是最便宜的解决方案:检索所有并使用(无查询),直到memcache重置,这种情况并不经常发生。我不明白给定的矩形如何给你一个随机分布。如果在坐标中建立了随机性,那么你就不需要随机密钥。如果你想要一个区域而不想使用地理空间,为什么不考虑使用GeHAHASH,然后只检索密钥,然后从密钥中随机选择并得到实体。谢谢!您的回答对我帮助很大:将坐标存储为GeoSpacial类型自动解决了我的问题。通过应用矩形过滤器,我得到了一个随机分布的位置。无论如何,这个功能只是一个alpha版本,所以我不能在appengine服务器/产品上使用它。你知道没有地球空间我怎么能实现这一点吗?我有一组huuge数据,10k+,所以我不想查询所有10k+是一个小数据集:)如果存储long、lat和ID,它们将很容易地放入单个memcache实体中。因此,这可能是最便宜的解决方案:检索所有并使用(无查询),直到memcache重置,这种情况并不经常发生。我不明白给定的矩形如何给你一个随机分布。如果在坐标中建立了随机性,那么你就不需要随机密钥。如果你想要一个区域而不想使用地理空间,为什么不考虑使用GeHAHASH,然后只检索密钥,然后从密钥中随机选择并获得实体。