Cassandra order by 和过滤二级索引

Cassandra order by and filter through secondary indexes

我的cassandratable结构如下:

CREATE TABLE sujata
          ... (ID int, roll_number int, age int, PRIMARY KEY (ID,roll_number));

我插入了一些记录,其中 ID 充当许多行的分区。我正在执行以下查询:

SELECT count(*) FROM sujata WHERE ID=1 ORDER BY roll_number ASC and age=24 Allow Filtering;

我收到以下错误:

missing EOF at 'and' (...1 ORDER BY roll_number ASC [and] age...)">

我不知道是否可以在执行排序后过滤掉结果。请建议我在哪里失踪。谢谢。

  1. 不要使用允许过滤。它不执行或 规模,因为它允许你以它本来的方式查询 Cassandra 不支持.

  2. CQL 将您的语句解释为 ORDER BY roll_number ASC and age=24,因为您试图对两件事进行 ORDER BY。 AND 属于您的 WHERE 子句,需要指定 之前 订购方式。

  3. Cassandra 使用您的集群键来写入您的数据 磁盘排序顺序。 ORDER BY 只允许你翻转排序 聚类顺序的方向(升序与降序)。所以 如果您已经在 table 中指定了正确的排序顺序 定义,则不需要指定 ORDER BY.

  4. 要通过 IDage 查询您的 table,您需要 将这两列作为前两列设计您的 PRIMARY KEY。 您只能查询 PRIMARY KEY 中定义的列(辅助 索引不耐),然后仅以相同的顺序(你 不能跳过键)。为此,我创建了一个查询 table (sujataByIDAndAge) 看起来像这样:

.

CREATE TABLE sujataByIDAndAge (
    ID int, 
    roll_number int, 
    age int, 
PRIMARY KEY (ID,age,roll_number));

插入几行后现在:

aploetz@cqlsh:Whosebug> INSERT INTO sujatabyidandage  (id, roll_number, age) 
                             VALUES (2, 20, 26);
aploetz@cqlsh:Whosebug> INSERT INTO sujatabyidandage  (id, roll_number, age) 
                             VALUES (1, 100, 24);
aploetz@cqlsh:Whosebug> INSERT INTO sujatabyidandage  (id, roll_number, age) 
                             VALUES (1, 110, 24);
aploetz@cqlsh:Whosebug> INSERT INTO sujatabyidandage  (id, roll_number, age) 
                             VALUES (1, 190, 24);

现在我可以运行你的查询,我不需要指定 ORDER BY 或 ALLOW FILTERING:

aploetz@cqlsh:Whosebug> SELECT COUNT(*) FROM sujatabyidandage WHERE ID=1 AND age=24;

 count
-------
     3

(1 rows)

同样重要的是,如果结果集顺序对您很重要,那么您必须按主键进行查询。 Cassandra 仅在分区键(您的情况下为 ID)内强制执行结果顺序。