cassandra中多列的范围

no *_*one 2 cql cassandra

我的桌子:

CREATE TABLE user_position (
  geopart text, // first 3 characters of geohash
  geohash text,
  datetime timestamp,
  userId bigint,
  PRIMARY KEY ((geopart), geohash, datetime, user_id)
);
Run Code Online (Sandbox Code Playgroud)

我的虚拟查询:

select * from user_position where geopart = 'abc' and geohash > 'a' and geohash < 'z' and datetime >= '2015-08-08 15:08:58+0530';
Run Code Online (Sandbox Code Playgroud)

错误:

Bad Request: PRIMARY KEY column "datetime" cannot be restricted (preceding column "geohash" is restricted by a non-EQ relation)
Run Code Online (Sandbox Code Playgroud)

题:

我做错了什么?如果在Cassandra中无法使用多列的范围,那么我该如何实现呢?

Ale*_*er 5

Cassandra在查询时非常严格,因为它不像RDBMS那样通用.您无法在Cassandra中对多个列执行范围查询.以下规则也适用:

  • 如果不进行全选,则需要提供分区键,以便Cassandra可以找到包含您要查找的数据的节点
  • 您只能过滤主键中的列(分区键和群集列)
  • 主键定义中列的顺序很重要 - 这就是Cassandra仍然将数据存储在磁盘上的方式
  • 如果"前一个"列也已过滤(按主键定义的顺序),则只能对群集列进行过滤
  • 执行范围查询后,无法进一步过滤后续的群集列

所有这些规则都是为了避免人们在Cassandra中运行反模式.

您必须在多个列上执行范围查询并拥有更强大的检索数据方法的一个选项是与Solr等搜索平台集成.