cassandra二级索引返回结果是词汇rowkey顺序,即使使用RandomPartitioner?

时间:2011-09-28 05:11:18

标签: cassandra

据我了解,Cassandra二级索引存储为内部CF,其中rowkeys是索引中的值,而row列是返回到索引的原始CF的行。

是否可以让索引的列存储原始的CF rowkey值?然后,由于索引行中的列已排序,因此理论上对索引中特定值的查询可以按排序的值顺序返回rowkeys。

如果我要手动维护自己的索引CF(我的手动索引CF将其列作为字符串排序),我就会这样做,我很好奇内置的内容是否相同二级指数。


一个有希望澄清的例子......我有5行,每行有2列(identifier可以轻松区分行,birth_date正在编制索引),每行都有一个UTF8键(在此case一个char字符串):

[default@demo] create column family users with comparator=UTF8Type
...     and column_metadata=
...     [{column_name: identifier, validation_class: LongType}
...     ,{column_name: birth_date, validation_class: LongType, index_type: KEYS}];
86518c00-e9f7-11e0-0000-242d50cf1fde
Waiting for schema agreement...
... schemas agree across the cluster
[default@demo] set users['a']['identifier'] = 1;
Value inserted.
[default@demo] set users['a']['birth_date'] = 1975;
Value inserted.
[default@demo] set users['c']['identifier'] = 3;
Value inserted.
[default@demo] set users['c']['birth_date'] = 1975;
Value inserted.
[default@demo] set users['b']['identifier'] = 2;
Value inserted.
[default@demo] set users['b']['birth_date'] = 1975;
Value inserted.
[default@demo] set users['x']['identifier'] = 5;
Value inserted.
[default@demo] set users['x']['birth_date'] = 1975;
Value inserted.
[default@demo] set users['f']['identifier'] = 4;
Value inserted.
[default@demo] set users['f']['birth_date'] = 1975;
Value inserted.

现在,当我进行索引查询时,我将用户行返回到其rowkeys的md5哈希值的相反顺序(查看identifier,结果顺序为x,b,f, C,A):

[default@demo] get users where birth_date = 1975;
-------------------
RowKey: ff
=> (column=birth_date, value=1975, timestamp=1317231030507000)
=> (column=identifier, value=5, timestamp=1317231030504000)
-------------------
RowKey: 0b
=> (column=birth_date, value=1975, timestamp=1317231030502000)
=> (column=identifier, value=2, timestamp=1317231030500000)
-------------------
RowKey: 0f
=> (column=birth_date, value=1975, timestamp=1317231031992000)
=> (column=identifier, value=4, timestamp=1317231030509000)
-------------------
RowKey: 0c
=> (column=birth_date, value=1975, timestamp=1317231030498000)
=> (column=identifier, value=3, timestamp=1317231030494000)
-------------------
RowKey: 0a
=> (column=birth_date, value=1975, timestamp=1317231030491000)
=> (column=identifier, value=1, timestamp=1317231030476000)

5 Rows Returned.

我的问题是,有没有办法让内部索引CF使用'a','b','c','f','x'作为其列名,这样当我进行索引查询时,我按词汇rowkey顺序返回用户行。

1 个答案:

答案 0 :(得分:2)

您无法做到这一点的原因是,索引排序必须与分区程序排序匹配,或者您无法跨多个节点“分页”结果集(无论如何都不必为每个查询进行分散/收集)

我们确实已开放https://issues.apache.org/jira/browse/CASSANDRA-1599以允许自定义排序,因此您应该观看该问题以进行更新。