Cassandra 1.1复合键,列和CQL 3中的过滤

时间:2012-09-06 10:16:53

标签: indexing cassandra database-indexes

我希望有一个表格如下:

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. 我读到Cassandra只能针对复合行键或索引列执行WHERE谓词。这仍然是真的吗?如果是这样,我将不得不制作列&lt; PK的数据部分。
  2. 是否仍然需要从左到右包含所有列,并且不能跳过任何列?
  3. 我的设计中是否有任何非最佳点?
  4. 我想添加一列“材料”,这是一系列产品系列中可能的材料。想想披萨配料,并查询“WHERE Materials IN('Pineapple')”。如果没有创建单独的材料倒排索引,然后针对上述查询执行手动交叉,那么在Cassandra中是否还有其他[更优雅]的处理方式?

2 个答案:

答案 0 :(得分:3)

如果您指定了正在查找的确切PK,正如您在此处所建议的那样(id IN ...),您可以在剩余的谓词中使用您喜欢的任何表达式。没有限制。

从1.2.0开始支持列表集合,计划于10月底发布。可能支持也可能不支持对索引内容进行索引查询。

答案 1 :(得分: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 <= ?

如果您不能错过任何从左到右的列[虽然不是过滤器但至少是*],并且您的所有值都在列名称而不是值中。

关于复合列,您应该了解的另一件事是&#34; Column Slice必须是连续的&#34;那么,pricelow&gt; = 10和pricelow&lt; = 40将返回一个连续的切片但是使用masslow和其他列过滤结果集将不起作用,因为它不会导致连续的切片。 BTW pricelow = 10和masslow&lt; = 20并且masslow&gt; = 10应该工作[用phpcassa测试],因为它将再次产生连续切片。

否则,在您的任何一列上创建一个或多个二级索引。然后,您有权根据列值进行查询,前提是您始终至少有一个查询中的索引字段。 http://www.datastax.com/docs/1.1/ddl/indexes

关于你的重要问题,如果我知道这是一个多值列,那么除了反向索引之外别无其他。

如果@jbellis验证这个

会很棒