我是cassandra的新手,我遇到了一个问题。我创建了一个keypace demodb和一个表用户。该表有3列:id(int和主键),firstname(varchar),name(varchar)。 这个请求给我带来了好结果:
SELECT * FROM demodb.users WHERE id = 3;
但是这一个:
SELECT * FROM demodb.users WHERE firstname = 'francois';
不起作用,我收到以下错误消息:
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: "
此请求也不起作用:
SELECT * FROM users WHERE firstname = 'francois' ORDER BY id DESC LIMIT 5;
InvalidRequest: code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported."
提前致谢。
答案 0 :(得分:15)
此请求也不起作用:
那是因为你错误地理解了排序顺序在Cassandra中是如何运作的。不要在firstname
上使用辅助索引,而是专门为此查询创建一个表,如下所示:
CREATE TABLE usersByFirstName (
id int,
firstname text,
lastname text,
PRIMARY KEY (firstname,id));
此查询现在应该有效:
SELECT * FROM usersByFirstName WHERE firstname='francois'
ORDER BY id DESC LIMIT 5;
请注意,我已在firstname
和id
上创建了复合主键。这会将您的数据划分为firstname
(允许您通过它进行查询),同时还会按id
对数据进行聚类。默认情况下,您的数据将按id
按升序进行聚类。要更改此行为,可以在表创建语句中指定CLUSTERING ORDER
:
WITH CLUSTERING ORDER BY (id DESC)
...然后你甚至不需要ORDER BY
条款。
我最近写了一篇关于聚类顺序如何在Cassandra中工作的文章(We Shall Have Order)。它解释了这一点,并涵盖了一些订购策略。
答案 1 :(得分:7)
cassandra中有一个约束:要在where子句中使用的任何字段都必须是表的主键,或者必须有一个辅助索引。所以你必须为firstname创建一个索引,然后才能在where条件中使用firstname,你将得到你期望的结果。