gpt4 book ai didi

java - 如何以编程方式将索引添加到 Cassandra 0.7

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:50 24 4
gpt4 key购买 nike

我尝试在 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

最佳答案

为了记录的目的。问题出在下面的代码上。

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

仅定义 index_type 是不够的。您还需要设置一个 index_name 才能正常工作。

关于java - 如何以编程方式将索引添加到 Cassandra 0.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4677057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com