我有一个使用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。有什么建议?我希望我很清楚!提前谢谢!
答案 0 :(得分:2)
Cassandra目前不支持二级索引查询中的析取(“或”),只支持连词(“和”)。在大多数情况下,对每个析取的一半进行两次单独的查询就足够了,并将结果组合起来。
但是,如果您正在处理时间范围,那么您应该使用列名,而不是二级索引。我建议查看time series data上的一些文档,并考虑如何重新构建数据以支持基于时间范围的高效查询。