如何在GAE上最好地设计日期/地理邻近度查询?

时间:2010-03-26 18:28:42

标签: python google-app-engine caching google-cloud-datastore web2py

我正在建立一个目录,用于在GAE上寻找体育比赛 web2py和Flex前端。用户选择位置,半径和最大值 来自一组选择的日期。我已经实现了这个查询的基本版本,但它确实如此 效率低,速度慢。我知道可以改进的一种方法是冷凝 我用来组装对象的许多单独查询 批量查询。我刚刚了解到这是可能的。但我也在考虑使用memcache进行更广泛的重新设计。

主要问题是我无法按位置查询数据存储区 因为GAE不允许多个数字比较语句 (<,< =,> =,>)在一个查询中。我已经使用了一个日期,我需要 两个检查纬度和经度,所以这是不行。目前, 我的算法看起来像这样:

1。)按日期查询并选择

2。)使用geopy的距离模块中的目标函数来查找 所提供距离的最大和最小纬度和经度

3.。)循环结果并删除所有lat / lng在max / min之外

4。)再次循环并使用距离函数来检查确切的 距离,因为步骤2将包括半径之外的一些区域。 删除超出所提供距离的结果(这是2/3/4组合 inefficent?)

5.。)组合多对多列表并附加到对象(这是我的地方 需要切换到批量操作)

6。)返回客户

这是我使用memcache的计划..让我知道我是否离开了 因为我之前没有使用memcache或服务器的经验 缓存一般。

- 在缓存中保存一个列表,其中包含代表所有内容的“地理对象” 我的数据。它们有五个属性:纬度,经度,event_id, event_type(期待扩展到锦标赛之外),以及 开始日期。此列表将按日期排序。

- 还要在缓存中保留一个指针的字典,表示开头 并在我的应用程序使用的所有日期范围的缓存中结束索引(下一步 一周,两周,一个月,三个月,六个月,一年,两年)。

- 有一个计划任务,每天早上12点更新指针。

- 向缓存和数据存储添加新插入;更新 指针。

使用此设计,算法现在看起来像:

1。)使用指针基于切掉适当的列表块 提供日期。

2-4。)与上述算法相同,除了地理对象

5.使用批量操作使用剩余的地理位置选择完整的锦标赛 对象'event_ids

6。)组装多对象

7.)返回客户

关于这种方法的想法?非常感谢阅读和任何建议 可以给。

-Dane

2 个答案:

答案 0 :(得分:2)

GeoModel是我发现的最好的。您可以查看我的GAE app如何返回地理空间查询。例如,印度http查询是使用地理模型库lat=20.2095231&lon=79.560344&cc=IN

的可选cc(国家/地区代码)

答案 1 :(得分:1)

您可能会对geohash感兴趣,这样您就可以执行这样的不等式查询:

  

选择纬度,经度,标题FROM   myMarkers WHERE geohash> =:sw_geohash   AND geohash< =:ne_geohash

查看本月Google App Engine this fine article博客文章中提到的App Engine Community Update

作为您提议的设计的注释,不要忘记Memcache中的实体不能保证留在内存中,并且您不能将它们“按日期排序”。