2014-09-18 90 views
3

我正在使用cassandra 2.1和最新的CQL。ORDER BY with 2ndary indexes is not supported

這裏是我的表&指標:

CREATE TABLE mydata.chats_new (
    id bigint, 
    adid bigint, 
    fromdemail text, 
    fromemail text, 
    fromjid text, 
    messagebody text, 
    messagedatetime text, 
    messageid text, 
    messagetype text, 
    todemail text, 
    toemail text, 
    tojid text, 
    PRIMARY KEY(messageid,messagedatetime) 
); 



CREATE INDEX user_fromJid ON mydata.chats_new (fromjid); 
CREATE INDEX user_toJid ON mydata.chats_new (tojid); 
CREATE INDEX user_adid ON mydata.chats_new (adid); 

當我執行此查詢:

select * from chats_new WHERE fromjid='test' AND toJid='test1' ORDER BY messagedatetime DESC; 

我得到這個錯誤:

code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported." 

那麼我們應該如何獲取這些數據?

+0

二級索引無意讓您以4種不同的方式查詢同一個表。你*應該*做的是建立3個額外的查詢表(chats_new_by_fromjid,chats_new_by_tojid,chats_new_by_adid)並且鍵入這些表來支持你想要的查詢。 – Aaron 2014-09-18 19:26:58

+0

@ BryceAtNetwork23好的,但在這種情況下,'messagedatetime'是聚類鍵(對吧?),所以Cassandra應該可以'訂購'它。 – Raedwald 2014-09-19 12:05:49

+0

@Rededwald是的,集羣鍵仍然生效。但作爲輔助索引查詢從多個分區中取回數據,它可能會或可能不會以排序的順序返回(這就是爲什麼'ORDER BY'不允許在二級索引查詢上)。 – Aaron 2014-09-19 13:23:39

回答

5
select * from chats_new 
WHERE fromjid='test' AND toJid='test1' 
ORDER BY messagedatetime DESC; 

code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported."

要獲得WHERE此查詢的WHERE子句的工作,我將建立一個特定的查詢表,就像這樣:

CREATE TABLE mydata.chats_new_by_fromjid_and_tojid (
    id bigint, 
    adid bigint, 
    fromdemail text, 
    fromemail text, 
    fromjid text, 
    messagebody text, 
    messagedatetime text, 
    messageid text, 
    messagetype text, 
    todemail text, 
    toemail text, 
    tojid text, 
    PRIMARY KEY((fromjid, tojid), messagedatetime, messageid) 
); 

注意主鍵定義。這會在fromjidtojid之間創建一個分區鍵。雖然這將允許您在兩個字段上進行查詢,但它也將需要這兩個字段在此表的所有查詢中指定。但是這就是爲什麼他們稱之爲「查詢表」,因爲它通常被設計爲服務於一個特定的查詢。

至於主鍵中的其餘字段,我保留messagedatetime作爲第一個集羣列,以確保磁盤上的排序順序。 Cassandra中的默認排序是遞增的,所以如果你想在查詢時改變它,那就是你的ORDER BY messagedatetime DESC發揮作用。最後,我確定messageid是第二個集羣列,以幫助確保主鍵唯一性(假設messageid是唯一的)。現在

,這個查詢將工作:

select * from chats_new_by_fromjid_and_tojid 
WHERE fromjid='test' AND toJid='test1' 
ORDER BY messagedatetime DESC; 

如果你需要附加條件來查詢這個數據,我強烈建議你創建額外的查詢表(一個或多個)。請記住,Cassandra最適合專門爲其所服務的每個查詢設計的表。可以多次複製數據,因爲磁盤空間很便宜......操作時間不是。

另外,DataStax在when not to use a secondary index上有很棒的文章。這絕對值得一讀。

+0

有一種方法可以對此結果進行分頁嗎? (按照你訂購的方式,我的fromjid和toJid具有相同的值。) – 2014-12-30 15:11:48

+0

@CBox假設你提前知道所需的分割值,你應該可以用'token()'函數來完成它。一個特定的分區鍵範圍:http://www.datastax.com/documentation/cql/3.1/cql/cql_using/paging_c.html – Aaron 2014-12-30 16:06:43

+0

是的問題是如何提前知道它們:)你有什麼想法嗎?謝謝! – 2014-12-30 16:15:47

相關問題