cassandra,通过非主键选择

mel*_*mel 15 cql cassandra cqlsh

我是cassandra的新手,我遇到了一个问题.我创建了一个keypace demodb和一个表用户.该表有3列:id(int和主键),firstname(varchar),name(varchar).这个请求给我带来了好结果:

SELECT * FROM demodb.users WHERE id = 3;
Run Code Online (Sandbox Code Playgroud)

但是这一个:

SELECT * FROM demodb.users WHERE firstname = 'francois';
Run Code Online (Sandbox Code Playgroud)

不起作用,我收到以下错误消息:

InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: "
Run Code Online (Sandbox Code Playgroud)

此请求也不起作用:

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."
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Aar*_*ron 15

此请求也不起作用:

那是因为你错误地理解了排序顺序在Cassandra中是如何运作的.不使用辅助索引firstname,而是专门为此查询创建一个表,如下所示:

CREATE TABLE usersByFirstName (
  id int,
  firstname text,
  lastname text,
  PRIMARY KEY (firstname,id));
Run Code Online (Sandbox Code Playgroud)

此查询现在应该有效:

SELECT * FROM usersByFirstName WHERE firstname='francois'
ORDER BY id DESC LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

注意,我在firstname和上创建了一个复合主键id.这将对您的数据进行分区firstname(允许您通过它进行查询),同时还可以对数据进行聚类id.默认情况下,您的数据将按id升序进行聚类.要更改此行为,可以CLUSTERING ORDER在表创建语句中指定a :

WITH CLUSTERING ORDER BY (id DESC)
Run Code Online (Sandbox Code Playgroud)

......然后你甚至不需要一个ORDER BY条款.

我最近写了一篇关于聚类顺序如何在Cassandra(We Shall Have Order)中运行的文章.它解释了这一点,并涵盖了一些订购策略.


Hel*_*d.. 7

cassandra中有一个约束:要在where子句中使用的任何字段都必须是表的主键,或者必须有一个辅助索引.所以你必须为firstname创建一个索引,然后才能在where条件中使用firstname,你将得到你期望的结果.