在Cassandra的二级索引上排序

时间:2017-03-03 13:09:55

标签: cassandra columnstore nosql

我正在评估一个解决方案的Cassandra用法,该解决方案需要查询分区键并获得按优先级列排序的前100个结果,这些结果不会出现在Clustered Key中。我只通过分片键查询。

CREATE TABLE my_table (
shard_key int,
enity_id int,
priority int, 
PRIMARY KEY ((shard_key), entity_id)
);
CREATE INDEX prio ON my_table (priority);

我可以编写一个有效的CQL查询,如

SELECT * FROM my_table WHERE shard_key=1 ORDER BY priority LIMIT 100

在Cassandra有可能还是我应该在其他地方看看?

2 个答案:

答案 0 :(得分:1)

在Cassandra 3.0中引入了物化视图
如果您使用的是cassandra 3.0或更高版本,则可以使用物化视图按非主键进行排序

像这样创建一个物化视图:

CREATE MATERIALIZED VIEW my_table_view AS
    SELECT shard_key, priority, entity_id
    FROM my_table
    WHERE shard_key IS NOT NULL AND priority IS NOT NULL AND entity_id IS NOT NULL
    PRIMARY KEY (shard_key, priority, entity_id);

假设您在my_table上有这些数据:

 shard_key | entity_id | priority
-----------+-----------+----------
         1 |        10 |      100
         1 |        11 |      101
         1 |        12 |      102
         1 |        13 |      103
         2 |        20 |      200

现在您可以像这样查询:

SELECT * FROM my_table_view WHERE shard_key = 1 ORDER BY priority ASC LIMIT 100;

输出将是:

 shard_key | priority | entity_id
-----------+----------+-----------
         1 |      100 |        10
         1 |      101 |        11
         1 |      102 |        12
         1 |      103 |        13

答案 1 :(得分:0)

作为替代解决方案,您可能需要考虑Stratio’s Lucene indexes按任何索引列排序。