【问题标题】:Google Datastore: Querying random entities with filterGoogle Datastore:使用过滤器查询随机实体
【发布时间】:2016-05-31 05:51:44
【问题描述】:

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

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

Location Entity: Latitude, Longitude, ...

到目前为止,我的方法如下:我引入了一个 double 类型的 randomKey 属性,其范围为 [0...1]。我将它与每个 Location 实体一起存储在 Datastore 中,并尝试按该属性进行排序:

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

有人可以给我一个关于如何进行的建议吗?我的方法是正确的还是有更好的方法?

提前致谢!

【问题讨论】:

    标签: google-app-engine google-cloud-datastore


    【解决方案1】:

    您的查询将不起作用,因为您在两个不同的属性上指定了不等式过滤器。您可能需要使用GeoSpacial query

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

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

    【讨论】:

    • 谢谢!您的回答对我帮助很大:将坐标存储为 GeoSpacial 类型自动解决了我的问题。通过应用矩形过滤器,我得到了位置的随机分布。
    • 无论如何,这个功能只是一个 alpha 版本,所以我不能在应用引擎服务器/生产上使用它。你知道没有 GeoSpacial 我怎么能实现这一点吗?我有一个庞大的数据集,10k+,所以我不想全部查询
    • 10k+ 是一个小数据集 :) 如果您存储 long、lat 和 ID,它们都将很容易适合单个 memcache 实体。所以这可能是最便宜的解决方案:检索所有并使用(不查询)直到 memcache 重置,这并不经常发生。
    • 我不明白给定的矩形如何为您提供随机分布。如果坐标中内置了随机性,则不需要随机键。
    • 如果您想要一个区域并且不想使用 GeoSpatial,为什么不考虑使用 geohash,然后仅检索键,然后从键中随机选择并获取实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多