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
Essayé avec 2 minutes. Toujours le même résultat. Merci. – tanyehzheng
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 –
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