cassandra中的范围查询

时间:2012-07-04 04:36:50

标签: cassandra

以下是按预期工作的。但我应该执行范围查询,例如“年龄> 40岁,年龄<50”

create keyspace Keyspace1;
use Keyspace1;
create column family Users with comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type;

set Users[jsmith][first] = 'John';
set Users[jsmith][last] = 'Smith';
set Users[jsmith][age] = long(42);

get Users[jsmith];
=> (column=age, value=42, timestamp=1341375850335000)
=> (column=first, value=John, timestamp=1341375827657000)
=> (column=last, value=Smith, timestamp=1341375838375000)

2 个答案:

答案 0 :(得分:3)

在Cassandra中执行此操作的最佳方式因您的要求而异,但这些方法与支持这些类型的范围查询非常相似。

基本上,您将利用行中的列按其名称排序的事实。因此,如果您使用年龄作为列名称(或列名称的一部分),则该行将按年龄排序。

您会发现这与存储时间序列数据有很多相似之处。我建议你看看Basic Time Series with Cassandra的基础知识,以及latest CQL features介绍的后半部分,它给出了一个更强大的方法的例子。

内置辅助索引基本上像哈希表一样设计,并且不适用于范围查询,除非该范围表达式伴随索引列上的相等表达式。因此,您可以要求select * from users where name = 'Joe' and age > 54,而不仅仅是select * from users where age > 54,因为这需要全表扫描。有关详细信息,请参阅辅助索引doc

答案 1 :(得分:1)

您必须在列年龄上创建辅助索引:

update column family Users with column_metadata=[{column_name: age, validation_class: LongType, index_type: KEYS}];

然后使用:

get Users where age > 40 and age < 50 

注意:我认为:自1.2以来不支持独占运算符。

Datastax有一个很好的文档:http://www.datastax.com/dev/blog/whats-new-cassandra-07-secondary-indexes或者您可以创建和维护自己的二级索引。这是一个很好的链接: http://www.anuff.com/2010/07/secondary-indexes-in-cassandra.html