2012-04-20 42 views
3

我一直在嘗試使用下面一組行創建索引。如何以編程方式在Cassandra Hector API中創建二級索引

KeyspaceDefinition fromCluster = cluster.describeKeyspace(KEYSPACE); 
ColumnFamilyDefinition cfDef = fromCluster.getCfDefs().get(0); 
BasicColumnFamilyDefinition columnFamilyDefinition = newBasicColumnFamilyDefinition(cfDef); 
BasicColumnDefinition columnDefinition = new BasicColumnDefinition(); 
columnDefinition.setName(StringSerializer.get().toByteBuffer("A_NO"));  
columnDefinition.setIndexName("A_NO_idx"); 
columnDefinition.setIndexType(ColumnIndexType.KEYS); 
columnDefinition.setValidationClass(ComparatorType.UTF8TYPE.getClassName()); 
columnFamilyDefinition.addColumnDefinition(columnDefinition); 

但我無法這樣做。實際上,我動態地將數據存儲在列中,以及動態創建這些列,之後爲了更好的查詢目的,我試圖將索引放在某些特定的列上。任何建議請如何做到這一點。

+0

嗯,我已經想出瞭如何做到這一點。 – abhi 2012-04-21 05:20:18

回答

5

它最終很簡單。您只需在定義您的columnfamily時創建二級索引。在上面的代碼中,所有的操作都是在只定義的時候創建的對象索引上完成的。添加索引的步驟

List<ColumnDef> columns = new ArrayList<ColumnDef>(); 
    columns.add(newIndexedColumnDef("columnName", "UTF8Type")); 
    List<ColumnDefinition> columnMetadata = ThriftColumnDef 
      .fromThriftList(columns); 
    cdefs.add(cf_def); //cf_def is your columnfamily definition 

輔助方法代碼爲KeyspaceCreationTest

public ColumnDef newIndexedColumnDef(String  column_name, String  comparer){ 
     ColumnDef cd = new ColumnDef(se.toByteBuffer(column_name), comparer); 
     cd.setIndex_name(column_name); 
     cd.setIndex_type(IndexType.KEYS); 
     return cd; 
    }  

參考比較器可以發現here

我希望這會幫助你。

+4

newIndexedColumnDef的實現丟失 – gubby 2012-06-12 14:26:21

+2

在此處找到了newIndexedColumnDef的代碼http://www.thydoc.com/cassandra-hector-core/doxygen/classme_1_1prettyprint_1_1hector_1_1api_1_1KeyspaceCreationTest.html – 2013-04-01 18:05:46

相關問題