在Cassandra IndexExpression中使用运算符'或'

时间:2012-11-30 11:05:25

标签: java cassandra pelops

我有一个使用Cassandra db的Java应用程序。我正在使用Cassandra Pelops。我有一个columnFamily cf1,还有很多列。对于其中一些我创建了二级索引,所以我可以使用它们进行搜索。出于搜索目的,我创建了一个IndexExpression(表达式)列表,例如:

final IndexExpression propertyIdExpression = new IndexExpression(
ByteBuffer.wrap(Bytes.fromUTF8(CassandraIntegrationDAOHelper.COL_PROPERTY_ID).toByteArray()),
                IndexOperator.EQ,
                ByteBuffer.wrap(Bytes.fromInt(entity.getProperty().getId()).toByteArray())
        );
        expressions.add(propertyIdExpression); 

现在我需要加入一些额外的检查。我有列dateFrom和dateTo。请求将返回此两个日期在某个时间间隔内的所有行。它们不必完全处于间隔期,重要的是在此间隔内开始或结束。所以,我需要以某种方式实现这样的事情:

if( (dateTo is greaterThan intervalStart) or (dateFrom is lowerThan intervalEnd) )

使用IndexExpression。有什么建议?我希望我很清楚!提前谢谢!

1 个答案:

答案 0 :(得分:2)

Cassandra目前不支持二级索引查询中的析取(“或”),只支持连词(“和”)。在大多数情况下,对每个析取的一半进行两次单独的查询就足够了,并将结果组合起来。

但是,如果您正在处理时间范围,那么您应该使用列名,而不是二级索引。我建议查看time series data上的一些文档,并考虑如何重新构建数据以支持基于时间范围的高效查询。