最初关于您的CREATE TABLE
陈述的一些事情:
;
它会在您的 PRIMARY KEY 定义之后 的分号 ( ) 上出错。
- 您将需要选择一个新名称,保留字
Index
也是如此。
请注意我按复合索引的第三列而不是第二列排序。
- 指定 时不能跳过集群键
CLUSTERING ORDER
。
但是,我确实在这里看到了一个选项。根据您的查询要求,您可以简单地重新排序keyword
并score
在您的 PRIMARY KEY 定义中,然后它会起作用:
CREATE TABLE giveMeABetterName(
user_id uuid,
keyword text,
score text,
fID int,
PRIMARY KEY (user_id, score, keyword)
) WITH CLUSTERING ORDER BY (score DESC) and COMPACT STORAGE;
这样,您可以查询,user_id
并且该用户的行(关键字?)将按以下顺序排序score
:
SELECT * FROM giveMeABetterName WHERE `user_id`=1b325b66-8ae5-4a2e-a33d-ee9b5ad464b4;
如果这对您的业务逻辑不起作用,那么您可能需要修改您的数据模型。但是在指定CLUSTERING ORDER
.
编辑
但是重新排序列对我不起作用。我可以做这样的事情吗WITH CLUSTERING ORDER BY (keyword asc, score desc)
让我们看看这里的一些选项。我用你原来的 PRIMARY KEY 创建了一个表,但是使用了这个 CLUSTERING ORDER。这在技术上是可行的,但看看它如何处理我的示例数据(视频游戏关键字):
aploetz@cqlsh:stackoverflow> SELECT * FROM givemeabettername WHERE user_id=dbeddd12-40c9-4f84-8c41-162dfb93a69f;
user_id | keyword | score | fid
--------------------------------------+------------------+-------+-----
dbeddd12-40c9-4f84-8c41-162dfb93a69f | Assassin's creed | 87 | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | Battlefield 4 | 9 | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | Uncharted 2 | 91 | 0
(3 rows)
另一方面,如果我将 PRIMARY KEY 更改为score
首先群集(并相应地调整 CLUSTERING ORDER),相同的查询将返回:
user_id | score | keyword | fid
--------------------------------------+-------+------------------+-----
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 91 | Uncharted 2 | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 87 | Assassin's creed | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 9 | Battlefield 4 | 0
请注意,您需要将数据类型score
从 TEXT 更改为数字 (int/bigint) 以避免 ASCII-betical 排序,如下所示:
user_id | score | keyword | fid
--------------------------------------+-------+------------------+-----
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 91 | Uncharted 2 | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 9 | Battlefield 4 | 0
dbeddd12-40c9-4f84-8c41-162dfb93a69f | 87 | Assassin's creed | 0
可能对您有所帮助的是通读有关Compound Keys and Clustering的 DataStax 文档。