2011-01-13 2 views
3

J'ai essayé d'exécuter la démo sur http://www.riptano.com/blog/whats-new-cassandra-07-secondary-indexes par programmation, mais les résultats sont différents de l'exécuter en CLI. Il semble que Cassandra ne peut indexer les colonnes qu'après l'ajout de l'index. Toutes les données précédentes sont laissées non indexées.Comment ajouter par programme un index à Cassandra 0.7

code source complet sont les suivantes: -

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(); 
    } 
} 

Les résultats sont les suivants: -

expecting: bsanderson htayler 
actual: bsanderson 

Répondre

1

Aux fins de l'enregistrement. Le problème réside dans le code suivant.

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

La définition de l'index_type seul n'est pas suffisante. Vous devez également définir un index_name pour que cela fonctionne.

0

Je prend un certain temps pour l'indice à construire. Dans ce cas, cela devrait prendre moins d'une seconde, mais il se peut qu'il ne soit pas terminé au moment où vous faites la requête. Essayez de dormir pendant une ou deux secondes après la création de l'index et voyez si cela change les résultats.

+0

Essayé avec 2 minutes. Toujours le même résultat. Merci. – tanyehzheng

+0

Est-ce que la suggestion de Jonathan Ellis au bas des commentaires a fonctionné pour vous? : http://www.riptano.com/blog/whats-new-cassandra-07-secondary-indexes –

+0

Non. J'ai changé tout getBytes en getBytes ("UTF-8) mais ça ne marche toujours pas.J'ai demandé aussi à la liste de diffusion des utilisateurs de cassandra mais seulement une personne a répondu après 3 jours. – tanyehzheng

Questions connexes