谷歌应用引擎数据模型的索引
Posted
技术标签:
【中文标题】谷歌应用引擎数据模型的索引【英文标题】:Indexes for google app engine data models 【发布时间】:2011-08-18 19:36:44 【问题描述】:我们需要多年的天气数据来构建报告应用程序。天气数据有许多不同类型的字段,例如城市、州、国家、邮政编码、纬度、经度、温度(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 个索引限制以下吗?此模型中的写入成本不是什么大问题,但我们需要超快速的读取。
【问题讨论】:
您需要能够对这些数字属性进行不等式过滤器还是只需要等式过滤器? 现在,只是相等过滤器。不等式过滤器可能会在以后出现,但暂时不会。 【参考方案1】:您最好的选择是依靠对合并连接查询的内置支持,它可以满足这些查询,而无需每个组合的索引。您需要做的就是为每个要过滤的字段定义一个索引并排序(如果始终是日期,那么每个字段只有一个索引)。详情请见this part of the docs。
【讨论】:
很高兴听到内置索引可以处理这个问题。 @Nick 在 SDK 1.5.2 之前做过这项工作吗? 尼克,谢谢你的回答。但即使对于这个简单的问题,您也可以看到任何真正的报告应用程序都希望能够对不同的字段进行排序,例如哪些城市在 x/y/z 日期温度最高或帕洛阿尔托最热的一天是什么时候。如果没有排序能力,您将如何从这个简单的数据集中回答这些查询? 如果我开始为每个字段的每个排序顺序定义一个索引,我很快就会达到 200 个限制。 更不用说,通常需要在两个方向上进行排序,以便每个字段每个排序顺序有 2 个索引,200 个限制甚至更接近。 @Bryce 这在以前没有排序的情况下工作,但 1.5.2 引入了使用复合索引进行排序合并连接的能力。【参考方案2】:我知道这似乎违反直觉,但只要您主要使用相等过滤器,您就可以使用支持类别(属性/任何内容)的全文搜索系统来执行此类操作。有一些方法可以让不平等过滤器发挥作用,但它们通常是有限的。刻面功能也很有用。
The upcoming Google Search API IndexTank is the service I currently use编辑:
是的,这完全是一个骇人听闻的解决方案。我使用它的文档已经在我的搜索索引中,而且我几乎总是也在过滤搜索词。
【讨论】:
我想避免一个骇人听闻的解决方案。我想要一些可以扩展的东西。在 RDBMS 世界中,这是一个很容易解决的问题,我想看看 NoSQL ppl 是如何处理这个问题的。 @Yasser 实际上,使这类 OLAP 查询在 RDBMS 世界中扩展并不简单。执行它们很容易,但可伸缩地执行它们却不是。 @Nick 我同意你的观点,但在你的数据集变得非常大之前,在 RDBMS 中你至少有能力建立你想要的任何索引,只是以空间为代价,即使你保留你的数据非规范化。你是说谷歌应用引擎只适用于无法与传统 RDBMS 很好扩展的应用? @Yasser "...直到您的数据集变得非常大..." @史蒂夫。我明白你们在说什么,但我认为我的问题非常具体。如果我有十年的天气数据(比如一百万条记录,仅此而已),我可以轻松创建一个 RDBMS 应用程序来对所有这些字段进行排序和搜索,并过滤我喜欢的任何内容。我要问的是,GAE 可以让我做同样的事情吗?我正在寻找的答案是否,或者如果是,那么如何。缩放显然是下一步,但我不想学习下一步,除非我知道第一步的解决方案!以上是关于谷歌应用引擎数据模型的索引的主要内容,如果未能解决你的问题,请参考以下文章
2023年AI十大展望:GPT-4领衔大模型变革,谷歌拉响警报,训练数据告急