appengine的数据如何存储查询和索引多值属性?

时间:2012-07-01 08:00:01

标签: google-app-engine indexing datastore

假设我有一个Photo类,其中包含标签和日期字段的多值属性。

我想允许用户基于标签执行查询(仅使用AND运算符获得超过1个标记)。

例如,假设用户搜索下雨天。 从Photo中选择*,其中tag =' clouds' AND tag ='下雨'

zig-zag合并是如何工作的?我知道执行了两次扫描,并且根据两次搜索中的键是否指向同一张照片,然后返回。这是否同时发生?例如:当搜索1找到包含标签'云的照片时,Search 2正在查找第一张包含标签" rainy"的照片。两次搜索完成后,它将变为同步。搜索1然后继续扫描,直到它击中与S2相同的键。然后,当每次搜索的键相同时,返回照片,并且"光标"每次搜索都会移动1步?

其次,定义多个索引会加速这些查询吗?例如,如果我想允许最多4个标签,那么我需要定义索引,例如: 指数(组图) 索引(照片,标签) 索引(照片,标签,标签) 索引(照片,标签,标签,标签) 索引(照片,标签,标签,标签,标签) 然后,执行上述相同的查询会更快?

此外,使用我们的原始查询,假设我们有数百万张照片被标记为阴天,但只有两张被标记为下雨。这是否意味着zig-zag会表现得相对较慢?既然其中一个搜索会尝试找到匹配的存在?更糟糕的是,如果我们有100万张照片被贴上标签"多雨"并且有一百万人被标记为" cloudly"但是没有一张照片中有两个标签。定义上述索引会解决这个问题吗?

最后,假设一张照片有100个标签。这是否意味着上面的所有索引必须包含100个标签的每个组合?

我知道有些yas(例如一个实体只能被索引5000次,而一个多值属性只能被索引1000次)。

1 个答案:

答案 0 :(得分:0)

  

zig-zag合并如何运作?

您可以在Building Scalable, Complex Apps on App Engine查看2009年的Google I / O视频。 Brett Slatkin解释了Zig-zag合并在27分钟后如何合并。正如他所说,“如果没有展示它是如何运作的,我就无法解释它。”