首页 文章

Cassandra where子句将SLICE和IN限制组合在一起

提问于
浏览
0

我想使用群集键上的过滤器来选择数据 .

特别是我需要两个集群键上的过滤器:

应使用切片过滤器限制

  • 第一个聚类键(如>,> =,<,<=)
    应使用IN过滤器限制
  • 第二个聚类键

使用最新版本的cassandra(3.11.0)这样的过滤器不起作用 . 顺便说一句:在文档中没有找到这个特殊的限制 .

以下是重现问题的步骤:

DROP TABLE IF EXISTS testing.t1

CREATE TABLE IF NOT EXISTS testing.t1 (
c1 text,
c2 int,
c3 text,
PRIMARY KEY (c1, c2, c3));

INSERT INTO testing.t1 (c1,c2,c3) VALUES ('key1',100,'clust1')
INSERT INTO testing.t1 (c1,c2,c3) VALUES ('key1',110,'clust1')
INSERT INTO testing.t1 (c1,c2,c3) VALUES ('key1',120,'clust2')
INSERT INTO testing.t1 (c1,c2,c3) VALUES ('key1',130,'clust3')
INSERT INTO testing.t1 (c1,c2,c3) VALUES ('key2',160,'clust2')

SELECT * FROM testing.t1
WHERE c1 = 'key1'
AND c2 > 100
AND c3 IN ('clust2','clust3')
ALLOW FILTERING

该查询生成以下错误:

code = 2200 [无效查询] message =“索引列不支持IN限制”

你能帮我解释一下这个问题吗?

有没有特别的理由不允许这样的过滤器或它是过去的残余?

谢谢!

1 回答

  • 1

    以下是documentation的摘录:

    IN关键字可以定义一组聚类列,以便一起提取,支持CQL行的“多次获取” . 如果为相等或组包含定义了所有前面的列,则可以定义单个群集列 .

    实质上,只有在使用相等或 IN 子句指定所有先前的聚类列时,才能使用 IN 子句 .

    但是,您可以在使用 IN 子句后使用切片过滤器,只要它适用于群集键的最后一个元素 .

    此限制也在此博客的 >, >=, <= and < restrictions 部分post中进行了描述(尽管它讨论的是版本2.2) .

相关问题