我的表格中有一列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
列中包含“有趣猫”的所有行。我怎么能这样做?
答案 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)