Cassandra CQL在列表中搜索元素

时间:2014-11-05 13:59:41

标签: cassandra cql cql3 datastax-enterprise

我的表格中有一列list类型(代码):

CREATE TABLE "Videos" (
    video_id UUID,
    title VARCHAR,
    tags LIST<VARCHAR>,
    PRIMARY KEY (video_id, upload_timestamp)
) WITH CLUSTERING ORDER BY (upload_timestamp DESC);

我有很多行包含tags列中的各种值,即。 ["outdoor","funny cats","funny mice"]

我想执行SELECT查询,该查询将返回tags列中包含“有趣猫”的所有行。我怎么能这样做?

1 个答案:

答案 0 :(得分:13)

要直接回答您的问题,是的,有一种方法可以实现这一目标。从Cassandra 2.1开始,您可以在集合上创建二级索引。首先,我将重新创建列系列定义(同时为upload_timestamp timeuuid添加定义)并在其中添加一些值。

aploetz@cqlsh:stackoverflow> SELECT * FROM videos ;

 video_id                             | upload_timestamp                     | tags                                          | title
--------------------------------------+--------------------------------------+-----------------------------------------------+---------------------------
 2977b806-df76-4dd7-a57e-11d361e72ce1 | fc011080-64f9-11e4-a819-21b264d4c94d |             ['sci-fi', 'action', 'adventure'] |                 Star Wars
 ab696e1f-78c0-45e6-893f-430e88db7f46 | 8db7c4b0-64fa-11e4-a819-21b264d4c94d |                               ['documentary'] | The Witches of Whitewater
 15e6bc0d-6195-4d8b-ad25-771966c780c8 | 1680d120-64fa-11e4-a819-21b264d4c94d | ['dark comedy', 'action', 'language warning'] |              Pulp Fiction

(3 rows)

接下来,我将在tags列上创建二级索引:

aploetz@cqlsh:stackoverflow> CREATE INDEX ON videos (tags);

现在,如果我想查询包含标记&#34;操作的视频,&#34;我可以使用CONTAINS关键字完成此操作:

aploetz@cqlsh:stackoverflow> SELECT * FROM videos WHERE tags CONTAINS 'action';

 video_id                             | upload_timestamp                     | tags                                          | title
--------------------------------------+--------------------------------------+-----------------------------------------------+--------------
 2977b806-df76-4dd7-a57e-11d361e72ce1 | fc011080-64f9-11e4-a819-21b264d4c94d |             ['sci-fi', 'action', 'adventure'] |    Star Wars
 15e6bc0d-6195-4d8b-ad25-771966c780c8 | 1680d120-64fa-11e4-a819-21b264d4c94d | ['dark comedy', 'action', 'language warning'] | Pulp Fiction

(2 rows)

总而言之,我应该传递几个警告:

  • 二级索引的规模效果不佳。它们的存在是为了提供便利而不是性能。如果您希望经常按标签查询,那么解决此问题的正确方法是创建一个videosbytag查询表,其中包含相同的数据,但键入如下:PRIMARY KEY (tag,video_id)
  • 您不需要表名中的双引号。事实上,在报价中使用它可能会引起你的问题(好吧,可能是轻微的烦恼)。