首页 > 解决方案 > Cassandra 过滤两列

问题描述

有没有办法过滤大于一列而小于另一列,或者适当地建模?

create table foo (id int, low int, high int, primary key (id, low, high));

这些查询有效:

select * from foo;
select * from foo where id = 1 and  low < 0;

但是这个查询没有:

select * from foo where id = 1 and  low < 0 and high >10;

并导致:

InvalidRequest:来自服务器的错误:code=2200 [Invalid query] message="无法限制聚类列“high”(前面的列“low”受非 EQ 关系限制)”

我目前采用允许过滤。它在一个分区上,并且对远远超出预期场景的场景的跟踪在可接受的范围内执行,但我想知道是否有更好的方法来对表进行建模以获取所有信息而不导致过滤?

标签: cassandracql

解决方案


在我看来,您唯一可以做的就是在物化视图中对high值进行过滤,如下所示:

CREATE MATERIALIZED VIEW IF NOT EXISTS foo_high_first 
AS SELECT id, low, high FROM foo
WHERE id IS NOT NULL AND low IS NOT NULL AND high IS NOT NULL
PRIMARY KEY (id, high, low);

然后您可以执行以下查询:

cqlsh:my_keyspace> select * from foo_high_first where id = 1 and high > 3;

 id | high | low
----+------+-----
  1 |    6 |   1

在应用程序中,您必须在低值和高值之间进行交集。

另外,请记住,您可以对聚类列进行排序,从而对低数字和高数字进行排序。


推荐阅读