2012-11-30 110 views
1

我有一個帶有Cassandra db的Java應用程序。我正在使用Cassandra Pelops。我有一個專欄cf1,並有很多專欄。對於他們中的一些我創建了二級索引,所以我可以使用它們進行搜索。對於搜索的目的,我創建IndexExpression(表情)的列表,例如:在Cassandra 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。有什麼建議麼?我希望我很清楚!提前致謝!

回答

2

卡桑德拉此時不支持二級索引查詢中的析取(「或」),只有連接(「和」)。在大多數情況下,對每個析取半部分進行兩個單獨的查詢並將結果合併就足夠了。

但是,如果您正在處理時間範圍,那麼您應該使用列名稱,而不是二級索引。我建議查看一下time series data的一些文檔,並考慮如何重構數據以支持基於時間範圍的高效查詢。

+1

感謝您的回答。不幸的是,現在改變數據結構不是一種選擇......我想只有兩個查詢的選項,我想避免它。 –