2011-01-13 9 views
3

http://www.riptano.com/blog/whats-new-cassandra-07-secondary-indexesでデモをプログラムで実行しようとしましたが、結果がCLIで実行された結果と異なります。カサンドラは、インデックスが追加された後にのみインデックスを作成できるようです。以前のすべてのデータはインデックスが解除されたままになります。プログラムでCassandraにインデックスを追加する方法

完全なソースコードは以下の通りです: -

public static void main(String[] args) { 
    try { 
     try { 
      transport.open(); 
     } catch (TTransportException ex) { 
      Logger.getLogger(IndexLaterTest.class.getName()).log(Level.SEVERE, null, ex); 
      System.exit(1); 
     } 
     KsDef ksDef = new KsDef(); 
     ksDef.name = KEYSPACE_NAME; 
     ksDef.replication_factor = 1; 
     ksDef.strategy_class = "org.apache.cassandra.locator.SimpleStrategy"; 
     CfDef cfDef = new CfDef(KEYSPACE_NAME, COLUMN_FAMILY_NAME); 
     cfDef.comparator_type = "UTF8Type"; 
     ColumnDef columnDef = new ColumnDef(ByteBuffer.wrap(FULL_NAME.getBytes()), "UTF8Type"); 

     cfDef.addToColumn_metadata(columnDef); 
     ColumnDef columnDef1 = new ColumnDef(ByteBuffer.wrap(BIRTH_DATE.getBytes()), "LongType"); 
     columnDef1.index_type = IndexType.KEYS; 
     cfDef.addToColumn_metadata(columnDef1); 
     ksDef.cf_defs = Arrays.asList(cfDef); 
     try { 
      client.system_add_keyspace(ksDef); 

      client.set_keyspace(KEYSPACE_NAME); 

      ColumnParent columnParent = new ColumnParent(); 
      columnParent.column_family = COLUMN_FAMILY_NAME; 
      Column column = new Column(ByteBuffer.wrap(FULL_NAME.getBytes()), ByteBuffer.wrap("Brandon Sanderson".getBytes()), System.currentTimeMillis()); 
      client.insert(ByteBuffer.wrap("bsanderson".getBytes()), columnParent, column, ConsistencyLevel.ONE); 
      column.name = ByteBuffer.wrap(BIRTH_DATE.getBytes()); 
      column.value = ByteBuffer.allocate(8).putLong(1975); 
      client.insert(ByteBuffer.wrap("bsanderson".getBytes()), columnParent, column, ConsistencyLevel.ONE); 

      column.name = ByteBuffer.wrap(FULL_NAME.getBytes()); 
      column.value = ByteBuffer.wrap("Patrick Rothfuss".getBytes()); 
      client.insert(ByteBuffer.wrap("prothfuss".getBytes()), columnParent, column, ConsistencyLevel.ONE); 
      column.name = ByteBuffer.wrap(BIRTH_DATE.getBytes()); 
      column.value = ByteBuffer.allocate(8).putLong(1973); 
      client.insert(ByteBuffer.wrap("prothfuss".getBytes()), columnParent, column, ConsistencyLevel.ONE); 

      column.name = ByteBuffer.wrap(FULL_NAME.getBytes()); 
      column.value = ByteBuffer.wrap("Howard Tayler".getBytes()); 
      client.insert(ByteBuffer.wrap("htayler".getBytes()), columnParent, column, ConsistencyLevel.ONE); 
      column.name = ByteBuffer.wrap(BIRTH_DATE.getBytes()); 
      column.value = ByteBuffer.allocate(8).putLong(1968); 
      client.insert(ByteBuffer.wrap("htayler".getBytes()), columnParent, column, ConsistencyLevel.ONE); 

      column.name = ByteBuffer.wrap(STATE.getBytes()); 
      column.value = ByteBuffer.wrap("WI".getBytes()); 
      client.insert(ByteBuffer.wrap("prothfuss".getBytes()), columnParent, column, ConsistencyLevel.ONE); 
      column.value = ByteBuffer.wrap("UT".getBytes()); 
      client.insert(ByteBuffer.wrap("htayler".getBytes()), columnParent, column, ConsistencyLevel.ONE); 

      KsDef ks = client.describe_keyspace(KEYSPACE_NAME); 
      cfDef = new CfDef(ks.cf_defs.get(0)); 
      ColumnDef columnDef2 = new ColumnDef(ByteBuffer.wrap(STATE.getBytes()), "UTF8Type"); 
      columnDef2.index_type = IndexType.KEYS; 
      cfDef.setColumn_metadata(Arrays.asList(columnDef, columnDef1, columnDef2)); 

      client.system_update_column_family(cfDef); 
      Thread.sleep(120000);//give cassandra enough time to build the index. 
      client.insert(ByteBuffer.wrap("bsanderson".getBytes()), columnParent, column, ConsistencyLevel.ONE); 

      IndexClause indexClause = new IndexClause(); 
      indexClause.start_key = ByteBuffer.allocate(0); 
      IndexExpression indexExpression = new IndexExpression(); 
      indexExpression.column_name = ByteBuffer.wrap(STATE.getBytes()); 
      indexExpression.value = ByteBuffer.wrap("UT".getBytes()); 
      indexExpression.op = IndexOperator.EQ; 
      indexClause.addToExpressions(indexExpression); 
      SliceRange sliceRange = new SliceRange(); 
      sliceRange.count = 10; 
      sliceRange.start = ByteBuffer.allocate(0); 
      sliceRange.finish = ByteBuffer.allocate(0); 
      sliceRange.reversed = false; 
      SlicePredicate slicePredicate = new SlicePredicate(); 
      slicePredicate.slice_range = sliceRange; 
      List<KeySlice> keys = client.get_indexed_slices(columnParent, indexClause, slicePredicate, ConsistencyLevel.ONE); 
      if (!keys.isEmpty()) { 
       System.out.println("expecting: bsanderson htayler"); 
       System.out.print("actual: "); 
       for (KeySlice key : keys) { 
        System.out.print(new String(key.getKey()) + " "); 
       } 
      } else { 
       System.out.println("failed to find indexed item"); 
      } 
     } catch (Exception ex) { 
      Logger.getLogger(IndexLaterTest.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 
      try { 
       client.system_drop_keyspace(KEYSPACE_NAME); 
      } catch (Exception ex) { 
       Logger.getLogger(IndexLaterTest.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } finally { 
     transport.close(); 
    } 
} 

結果は以下のとおりです。 -

expecting: bsanderson htayler 
actual: bsanderson 

答えて

1

記録の目的で。問題は次のコードにあります。

ColumnDef columnDef1 = new ColumnDef(ByteBuffer.wrap(BIRTH_DATE.getBytes()), "LongType"); 
columnDef1.index_type = IndexType.KEYS; 

index_typeだけでは不十分です。 index_nameも同様に設定する必要があります。

0

私は、インデックスが構築されるまでに時間がかかります。この場合は1秒未満で済みますが、クエリを作成するまでに完了していない可能性があります。

インデックスを作成してから1〜2秒間スリープ状態にして、結果が変わるかどうかを確認してください。

+0

2分で試行します。それでも同じ結果。ありがとう。 – tanyehzheng

+0

コメントの一番下にあるJonathan Ellisの提案は、あなたのために機能しましたか? :http://www.riptano.com/blog/whats-new-cassandra-07-secondary-indexes –

+0

Nope。私はgetBytesをgetBytes( "UTF-8")に変更しましたが、まだ動作していません。私はcassandraユーザーのメーリングリストにも依頼していましたが、3日後には1人だけが応答しました。 – tanyehzheng

関連する問題