cassandra,通过非主键选择

时间:2015-04-22 09:36:44

标签: cassandra cql cqlsh

我是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."

提前致谢。

2 个答案:

答案 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;

请注意,我已在firstnameid上创建了复合主键。这会将您的数据划分为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,你将得到你期望的结果。