先介绍一下背景知识:GeoModel是我编写的一个库,它为 App Engine 应用程序添加了非常基本的地理空间索引和查询功能。它与地理散列的方法相似。GeoModel 中的等效位置哈希称为“geocell”。
目前,GeoModel 库为每个位置感知实体添加了 13 个属性 (location_geocell__n_, n =1..13)。例如,实体可以具有以下属性值:
location_geocell_1 = 'a'
location_geocell_2 = 'a3'
location_geocell_3 = 'a3f'
...
这是必需的,以便在空间查询期间不使用不等式过滤器。
13 属性方法的问题在于,对于应用程序想要运行的任何地理查询,必须定义和构建 13 个新索引。这绝对是一个维护麻烦,因为我刚刚在为项目重写演示应用程序时痛苦地意识到。这引出了我的第一个问题:
问题 1:每个索引是否有任何显着的存储开销?即,如果我有 13 个索引,每个索引有 n 个实体,而 1 个索引有 13n 个实体,那么前者在存储方面是否比后者差得多?
根据这篇文章,似乎 (1) 的答案是否定的,但我只是想看看是否有人有不同的经历。
现在,我正在考虑调整 GeoModel 库,以便只有一个名为 location_geocells 的 StringListProperty 而不是 13 个字符串属性,即:
location_geocells = ['a', 'a3', 'a3f']
这导致更清洁index.yaml
。但是,我确实质疑性能影响:
QUESTION 2:如果我从 13 个字符串属性切换到 1 个 StringListProperty,查询性能是否会受到不利影响;我当前的过滤器看起来像:
query.filter('location_geocell_%d =' % len(search_cell), search_cell)
新的过滤器看起来像:
query.filter('location_geocells =', search_cell)
请注意,第一个查询具有 _n_ 个实体的搜索空间,而第二个查询具有 _13n_ 个实体的搜索空间。
似乎 (2) 的答案是,根据这篇博文中的提示 #6,两者都会产生相同的查询性能,但我想再次看看是否有人对此有任何不同的实际经验。
最后,如果有人有任何其他建议或技巧可以帮助提高存储利用率、查询性能和/或易用性(特别是 wrt index.yaml),请告诉我!源代码可以在这里找到geomodel & geomodel.py