2012-09-06 87 views
1

我希望有一個表的東西如下:卡桑德拉1.1複合密鑰,列和濾波CQL 3

CREATE TABLE ProductFamilies (
    ID varchar, 
    PriceLow int, 
    PriceHigh int, 
    MassLow int, 
    MassHigh int, 
    MnfGeo int, 
    MnfID bigint, 
    Data varchar, 
    PRIMARY KEY (ID) 
); 

總共有13個領域。其中大部分代表水桶。數據是產品系列ID的JSON,然後用於後續查詢。 鑑於Cassandra的工作方式,引擎蓋下的列名將是值。我希望過濾這些。

我希望如下運行查詢:

SELECT Data FROM MyApp.ProductFamilies WHERE ID IN (?, ?, ?) AND PriceLow >= ? 
AND PriceHigh <= ? AND MassLow >= ? AND MassHigh <= ? and MnfGeo >= ? AND 
MnfGeo <= ? 
  1. 我讀的卡桑德拉只能執行WHERE對複合排按鍵或索引列謂詞。這仍然是真的嗎?如果是這樣,我將不得不使數據部分的PK列<。
  2. 是否仍然需要從左到右包含所有列並且不能跳過?
  3. 我的設計中是否有非最佳點?
  4. 我想添加一列「材料」,這是一個產品系列中可能的材料數組。想想比薩澆頭,並查詢「哪裏的材料('菠蘿')」。如果不創建單獨的材質倒排索引,然後對上述查詢執行手動交集,在Cassandra中是否還有其他[更優雅]的處理方式?
+0

再次,這是我的答案,它仍然是成立的:d http://stackoverflow.com/questions/11825783/cassandra-and-querying-hierarchies/11828376 #11828376 – Tamil

+0

是的......謝謝,但是隻能對PK進行過濾的點呢?我知道你的答案是真的;) – IamIC

+0

還有關於#4的任何想法? – IamIC

回答

2

基本上支持你查詢你需要有

create column family ProductFamilies with 
comparator='CompositeType(UTF8Type, Int32Type, Int32Type, Int32Type, Int32Type, Int32Type, LongType, UTF8Type)' 
and key_validation_class='UTF8Type' 

CREATE TABLE ProductFamilies (
    ID varchar, 
    PriceLow int, 
    PriceHigh int, 
    MassLow int, 
    MassHigh int, 
    MnfGeo int, 
    MnfID bigint, 
    Data varchar, 
    PRIMARY KEY (ID, PriceLow, PriceHigh, MassLow, MnfGeo, MnfID, Data) 
); 

現在,您可以查詢

SELECT Data FROM MyApp.ProductFamilies WHERE ID IN (?, ?, ?) AND PriceLow >= ? 
AND PriceHigh <= ? AND MassLow >= ? AND MassHigh <= ? and MnfGeo >= ? AND 
MnfGeo <= ? 

只要不從不放過任何列從左到右[雖然不是過濾器,但至少是*]和所有喲你的值是在列名稱而不是值。

一個必須瞭解關於複合列的更多的是「列片必須是連續的」所以,pricelow> = 10和pricelow < = 40將返回一個連續的片,但過濾的結果與masslow等欄目設置將不會工作,因爲它不會導致連續的片段。 BTW pricelow = 10,masslow < = 20,masslow> = 10應該[使用phpcassa測試],因爲它會再次產生連續的片段。

否則在您的任何一列上創建一個或多個二級索引。然後,您有權根據列值進行查詢,前提是您始終擁有查詢中的至少一個索引字段。 http://www.datastax.com/docs/1.1/ddl/indexes

關於你的重大問題,除了倒序索引,如果它將成爲我知道的多值列,沒有別的辦法。

如果@jbellis驗證這將是巨大此

+0

你爲什麼寫「PRIMARY KEY(ID,PriceLow, PriceHigh,MassLow,MnfGeo,MnfID,Data)「?至少,數據當然是最終的價值? @jbellis似乎表明不再需要在PK中包含所有查詢的列。然後 – IamIC

+0

@IanC我希望如果我理解正確組合柱的鳴叫例子http://www.datastax.com/docs/1.1/ddl/column_family#composite-columns我所提到的應該ü – Tamil

+0

工作,它工作,是的。我只是認爲新版本已經放寬了以前的一些要求。 – IamIC

3

如果您指定了正在查找的確切PK,正如您在此處提出的(id IN ...),則可以在其餘謂詞中使用您喜歡的任何表達式。沒有限制。

支持列表集合從1.2.0開始,定於10月底發佈。收集內容的索引查詢可能支持也可能不支持。

+0

我看到你的電子郵件表示#1 (哪裏必須是PK組件)。所以這已經def了。改變了嗎? – IamIC

+0

列表集合是否支持push和pop? – IamIC

+0

@jbellis這將是偉大的,如果你能驗證我的答案:) – Tamil