我希望有一个表格如下:
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 <= ?
答案 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验证这个
会很棒