如何最好地设计在GAE上的日期/地理邻近查询?(How to best design a date/

2019-10-20 16:12发布

我建立一个目录上找到GAE运动比赛用的web2py和一个Flex前端。 用户选择一个位置,半径,并从一组选择的最大日期。 我有这样的查询执行的基本版本,但它是低效的和缓慢的。 我知道我可以改进的一种方式是通过冷凝我使用组装物体进入批量查询许多单独的查询。 我刚刚得知是可能的。 但我也想利用内存缓存更广泛的重新设计。

主要的问题是,我无法通过位置查询数据存储区,因为GAE将不允许多个数值比较语句(<,<=,> =,>)在一个查询。 我已经使用一个日期,而我需要两个检查经度和纬度,所以这是一个没有去。 目前,我的算法是这样的:

1。)按照日期和选择查询

2。)从geopy的距离模块使用目的地函数来找到最大和最小纬度和经度为供给的距离

3.)循环通过的结果,并删除所有与最大/最小外纬度/经度

4.)通过再次和使用距离函数循环来检查精确的距离,因为步骤2将包括半径之外一些区域。 除去供给距离之外的结果(这是2/3/4组合inefficent?)

5.)组装多对许多列表和附加到对象(这是在我需要切换到批量操作)

6.)返回到客户端

这是我使用的memcache计划..让我知道,如果我在左外野的出路这是我与一般的内存缓存或服务器缓存没有现成的经验。

- 保持在充满代表我的所有数据“地理对象”缓存列表。 其中有5个属性:纬度,经度,EVENT_ID,EVENT_TYPE(扩大超出了比赛的预期),和起始日期。 这份名单按日期排序。

- 也保持指针的字典中,表示在缓存中的起点和终点指标为所有的日期范围缓存我的应用程序使用(下一个周,2周,月,3个月,6个月,年,2年)。

- 具备一个计划任务,在凌晨零点更新指针。

- 添加新的插入到缓存以及数据存储; 更新指针。

采用这种设计,算法现在看起来像:

1)使用指针来切掉根据提供的日期列表的适当块。

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

5.)使用批量操作用剩余的地理对象的event_ids以选择完整比赛

6.)组装多到manys

7)返回到客户端

这种方法的思考? 非常感谢阅读,你可以给任何意见。

-Dane

Answer 1:

你可能会感兴趣geohash ,使您能够做一个不平等的查询是这样的:

SELECT纬度,经度,标题从那里myMarkers地理散列> =:sw_geohash AND地理散列<=:ne_geohash

看看这个美好的文章这是在这个月的谷歌应用程序引擎的精选App Engine的社区更新的博客文章。

至于你的建议设计一个音符,不要忘了,在内存缓存的实体都没有留在记忆的担保,而且,你不能让他们“按日期排序”。



Answer 2:

地质模型是我找到最好的。 你可以看看我的GAE如何应用程序返回地理空间查询。 例如印度HTTP查询是使用可选的CC(国家代码)地质模型库lat=20.2095231&lon=79.560344&cc=IN



文章来源: How to best design a date/geographic proximity query on GAE?