谷歌应用引擎数据模型的索引

时间:2011-08-18 19:36:45

标签: google-app-engine nosql bigtable

我们有多年的天气数据,我们需要建立一个报告应用程序。天气数据有许多不同类型的领域,例如城市,州,国家,邮政编码,纬度,经度,温度(hi / lo),温度(avg),降水,风速,日期等。

我们的报告要求我们选择这些字段的组合,然后对它们进行排序,搜索和过滤,例如

WeatherData.all().filter('avg_temp =',20).filter('city','palo alto').filter('hi_temp',30).order('date').fetch(100)

WeatherData.all().filter('lo_temp =',20).filter('city','palo alto').filter('hi_temp',30).order('date').fetch(100)

可能很容易看出这些查询需要不同的索引。显而易见的是,200索引限制可以非常容易地与任何这样的数据模型交叉,其中将使用字段组合来过滤,排序和搜索实体。最后,考虑到有许多城市,这种数据模型中的实体数量显然可以达到数百万,我们可以每小时而不是每天进行数据。

任何人都可以推荐一种方法来建模这些数据,这样可以让所有查询仍然运行,同时保持在200索引限制之下吗?这个模型中的写入成本并不是很大,但我们需要超快速读取。

2 个答案:

答案 0 :(得分:1)

您最好的选择是依靠对合并连接查询的内置支持,这可以满足这些查询而不需要每个组合的索引。您需要做的就是为每个要筛选的字段定义一个索引并对顺序进行排序(如果这始终是日期,则每个字段的索引为一个索引)。有关详细信息,请参阅this part of the docs

答案 1 :(得分:0)

我知道这似乎是违反直觉的,但只要您主要使用相等过滤器,就可以使用支持类别(属性/其他)的全文搜索系统来执行此类操作。有一些方法可以使不等式过滤器工作,但它们通常是有限的。刻面特征也很有用。

修改

是的,这完全是一个hackish解决方案。我使用它的文档已经在我的搜索索引中了,我几乎总是在搜索条件上过滤。