2

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

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

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

之字形合并如何工作?我知道执行了两次扫描,并且基于两个搜索的键是否指向同一张照片,然后返回。然而,这会同时发生吗?例如:当搜索 1 找到一张包含标签“云”的照片时,搜索 2 正在找到第一张包含标签“下雨”的照片。当两个搜索都完成后,它就变成了同步的。然后搜索 1 继续它的扫描,直到它击中与 S2 相同的键。那么当每次搜索的键相同时,返回照片,每次搜索时“光标”移动 1 步?

其次,定义多个索引会加速这类查询吗?例如,如果我想允许最多 4 个标签,那么我需要定义索引,例如: Index(Photo) Index(Photo, tag) Index(Photo, tag,tag) Index(Photo, tag,tag,tag) Index(Photo, tag,tag,tag,tag) 那么,执行上面相同的查询会更快吗?

另外,使用我们的原始查询,假设我们有数百万张照片被标记为多云,但只有两张被标记为下雨。这是否意味着之字形将执行相对较慢?由于其中一个搜索将尝试找到匹配的存在吗?更糟糕的是,如果我们有一百万张照片被标记为“下雨”,而一百万张照片被标记为“多云”,但没有一张照片同时包含这两个标签。定义上述索引会解决这个问题吗?

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

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

4

1 回答 1

0

之字形合并如何工作?

您可以观看 2009 年的 Google I/O 视频,内容是在 App Engine 上构建可扩展的复杂应用程序。Brett Slatkin 从 27 分钟开始解释 zig-zag 合并的工作原理。正如他所说,“如果不展示它是如何工作的,我无法真正解释它。”

于 2012-07-03T22:55:37.760 回答