2

我正在阅读以下链接,它提供了对复合列的介绍,我几乎没有疑问,特别是关于 ComponentEquality.EQUAL 和 ComponentEquality.GREATER_THAN_EQUAL 的用法。

在以下示例中:

Composite start = compositeFrom(startArg, Composite.ComponentEquality.EQUAL);
Composite end = compositeFrom(startArg, Composite.ComponentEquality.GREATER_THAN_EQUAL);
start.addComponent(1,"CA",Composite.ComponentEquality.EQUAL);
end.addComponent(1,"CA",Composite.ComponentEquality.GREATER_THAN_EQUAL);

我无法理解为什么最终组件需要 GREATER_THAN_EQUAL 作为相等组件。举例说明会很有帮助

4

1 回答 1

3

切片查询在 cassandra 中的工作方式是您指定一个开始列和一个结束列(limit/isDescending 标志也是如此,但这在这里无关紧要)。查询您的用例的一种方法是传递以 US:CA 开头的第一个复合列和以 US:CA 开头的最后一个复合列的完整(复合)列名称。但是,您事先并不知道这一点。

切片查询的好处是开始和结束列不需要是实际的列名。由于列名总是排序的,如果切片查询中的起始列不存在,cassandra 将从大于提供的起始列的下一列开始。

因此,我们需要为您的查询构造一个开始列和一个结束列。如链接中所述,复合对象具有 eoc 位。该位由切片查询使用。

一个复合列有几个组件。每个组件都有 eoc 位。当一个组件将此位设置为 Equal 时,Cassandra 继续查看下一个组件。当一个组件将此位设置为 GREATER_THAN_EQUAL 时,Cassandra 将继续查看列,直到找到相应组件不等于我们正在查找的组件的内容。

因此,现在考虑链接中的示例:我们要对具有包含三个组件的复合比较器的列族进行切片查询。我们想要获取第一个组件为 US 而第二个组件等于 CA 的所有列。

我们必须创建一个开始列和一个结束列。开始列将有两个组件(均以 EQUAL 作为 eoc),结束列将具有第一个组件作为 EQUAL,第二个组件作为 GREATER_THAN_EQUAL。这将匹配所有第一个组件是 US 而第二个组件是 CA 的列。

如果将此位设置为 EQUAL,切片查询将匹配它找到的第一列,其起始分量等于“CA”。这很好,但 Cassandra 还需要知道切片查询的结束列。为此,它将查看您提供的最终组合。

希望这有帮助。

编辑:为了更好地解释

于 2012-07-17T14:05:11.033 回答