Indexing Cassandra 1.1 CQL 3中的组合键、列和筛选

Indexing Cassandra 1.1 CQL 3中的组合键、列和筛选,indexing,cassandra,database-indexes,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) ); SELECT Data FROM MyApp.ProductFamilies WHERE ID IN (?, ?, ?)

我想要一张如下的桌子:

CREATE TABLE ProductFamilies (
  ID varchar,
  PriceLow int,
  PriceHigh int,
  MassLow int,
  MassHigh int,
  MnfGeo int,
  MnfID bigint,
  Data varchar,
  PRIMARY KEY (ID)
);
SELECT Data FROM MyApp.ProductFamilies WHERE ID IN (?, ?, ?) AND PriceLow >= ? 
AND PriceHigh <= ? AND MassLow >= ? AND MassHigh <= ? and MnfGeo >= ? AND 
MnfGeo <= ?
总共有13个字段。其中大多数表示桶。数据是产品系列ID的JSON,然后在后续查询中使用。考虑到Cassandra的工作原理,引擎盖下的列名将是值。我想过滤这些

我希望进行如下查询:

CREATE TABLE ProductFamilies (
  ID varchar,
  PriceLow int,
  PriceHigh int,
  MassLow int,
  MassHigh int,
  MnfGeo int,
  MnfID bigint,
  Data varchar,
  PRIMARY KEY (ID)
);
SELECT Data FROM MyApp.ProductFamilies WHERE ID IN (?, ?, ?) AND PriceLow >= ? 
AND PriceHigh <= ? AND MassLow >= ? AND MassHigh <= ? and MnfGeo >= ? AND 
MnfGeo <= ?
我了解到Cassandra只能对复合行键或索引列执行WHERE谓词。这仍然是真的吗?如果是这样,我将不得不使列<数据成为PK的一部分。 是否仍然需要从左到右包含所有列,并且不能跳过任何列? 我的设计中有没有非最佳点? 我想添加一个列Materials,它是产品系列中可能的材质数组。想一想比萨配料,并询问“菠萝”中的材料。如果不创建单独的材料倒排索引,然后对上述查询执行手动交集,那么在Cassandra中还有其他[更优雅的]处理方法吗?
如果您指定要查找的确切PK,正如您在…中建议的那样,您可以在其余谓词中使用您喜欢的任何表达式。没有限制


从1.2.0开始支持列表集合,该版本定于10月底发布。集合内容的索引查询可能受支持,也可能不受支持。

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


从1.2.0开始支持列表集合,该版本定于10月底发布。集合内容的索引查询可能受支持,也可能不受支持。

基本上是为了支持您需要的查询

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

现在您可以查询

SELECT Data FROM MyApp.ProductFamilies WHERE ID IN (?, ?, ?) AND PriceLow >= ? 
AND PriceHigh <= ? AND MassLow >= ? AND MassHigh <= ? and MnfGeo >= ? AND 
MnfGeo <= ?
如果您不错过从左到右的任何列[虽然不是筛选器,但至少是一个*],并且您的所有值都在列名中,而不是值中。


关于复合列,您应该了解的另一件事是列切片必须是连续的,因此,pricelow>=10和pricelow基本上支持您需要的查询

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

现在您可以查询

SELECT Data FROM MyApp.ProductFamilies WHERE ID IN (?, ?, ?) AND PriceLow >= ? 
AND PriceHigh <= ? AND MassLow >= ? AND MassHigh <= ? and MnfGeo >= ? AND 
MnfGeo <= ?
如果您不错过从左到右的任何列[虽然不是筛选器,但至少是一个*],并且您的所有值都在列名中,而不是值中。



关于复合列,您还应该了解的一点是,列切片必须是连续的,因此,pricelow>=10,pricelow再次说明这是我的答案,它仍然是正确的:D是。。。谢谢,但是仅仅能够针对PK进行过滤又有什么意义呢?我知道你的回答是正确的;根据您的读取模式对数据建模是cassandra的经验法则。上面提到的唯一原因是你不能进行连接,在索引一个列之前你不能对列值进行过滤:所以,请提及你的完整用例并阅读模式以获得帮助:PI认为我提到了我的用例:P。。。让我展开这个问题。我的数据是按照我的读取模式建模的。基于你的上一次。回答,我相信我的回答是正确的。据我所知,CQL3将把值存储为列名,不包括最终的数据值。。。谢谢,但是仅仅能够针对PK进行过滤又有什么意义呢?我知道你的回答是正确的;根据您的读取模式对数据建模是cassandra的经验法则。上面提到的唯一原因是你不能进行连接,在索引一个列之前你不能对列值进行过滤:所以,请提及你的完整用例并阅读模式以获得帮助:PI认为我提到了我的用例:P。。。让我展开这个问题。我的数据是按照我的读取模式建模的。基于你的上一次。回答,我相信我的回答是正确的。据我所知,CQL3将以列名的形式存储这些值,不包括最终的数据值。我看到您的一封电子邮件,其中指出1必须针对PK组件。这就是def。已更改?列表集合是否支持推送和弹出?@jbellis如果您能验证我的答案,那就太好了:而且,这是否意味着只要实际指定了PK,WHERE子句就可以用于schmeless设计中,我没有得到PK和can之间的连接。@jbellis请看这个问题:我看到一封来自您的电子邮件,指出1 PK组件必须在哪里。这就是def。已更改?列表集合是否支持推送和弹出?@jbellis如果您能验证我的答案,那就太好了:而且,这是否意味着只要实际指定了PK,WHERE子句就可以用于schmeless设计中,我不明白PK和can use WHERE之间的联系。@jbellis请看这个问题:为什么要写主键ID、PriceLow、pricelhigh、MassLow、MnfGeo、MnfID、Data?至少,数据肯定是最终的价值吗@杰贝利斯似乎表明,一个不再
需要在PK中包含所有查询的列。@我希望如果我正确理解了复合列的tweets示例,那么我所提到的应该适用于uIt的内容将适用,是的。我只是觉得新版本放宽了一些早期的要求。我终于尝试了这个。请看这个问题:为什么要写主键ID、PriceLow、pricelhigh、MassLow、MnfGeo、MnfID、Data?至少,数据肯定是最终的价值吗@jbellis似乎表明,PK中不再需要包含所有查询列。@Ian我希望如果我正确理解了复合列的tweets示例,那么我所提到的应该适用于uIt,是的。我只是觉得新版本放宽了一些早期的要求。我终于尝试了这个。请看这个问题: