2014-11-05 167 views
3

搜索元件我有了list類型的列的表(代碼):卡桑德拉CQL在列表

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列中包含「有趣的貓」的所有行。我怎樣才能做到這一點?

回答

8

要直接回答你的問題,是的,有一種方法可以做到這一點。從Cassandra 2.1開始,您可以在集合上創建二級索引。首先,我將重新創建列族定義(同時爲upload_timestamp timeuuid添加一個定義)並在其中添加一些值。

[email protected]: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列創建一個輔助指標:

[email protected]:stackoverflow> CREATE INDEX ON videos (tags); 

現在,如果我要查詢包含標籤的影片「行動,」我可以做到這一點在CONTAINS關鍵字:

[email protected]: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)
  • 您不需要雙引號在你的表名中。事實上,引用它可能會導致你在路上遇到問題(好吧,也許是輕微的刺激)。
+0

它看起來像是我的問題的完美解決方案。不幸的是,我不能在標籤列上使用優雅的解決方案,因爲DataStax Enterprise仍然使用Cassandra 2.0.10.x。看起來我需要去查詢表解決方案。無論如何,感謝您提供非常詳細的答案。它解決了我的問題,我可以學到一些東西。 – kazy 2014-11-05 16:48:30

+0

太棒了,很高興我能幫到你! – Aaron 2014-11-05 16:49:09

+0

太棒了!列表中的「包含」可以幫助我很多。 – asgs 2015-06-07 08:43:03