Как программно добавить индекс в Cassandra 0.7 - PullRequest
3 голосов
/ 13 января 2011

Я попытался запустить демо на 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 

Ответы [ 2 ]

1 голос
/ 25 сентября 2012

с целью записи.Проблема заключается в следующем коде:

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

Недостаточно только определить index_typeВам также нужно установить index_name для его работы.

0 голосов
/ 13 января 2011

Для построения индекса требуется некоторое время.В этом случае это может занять меньше секунды, но, возможно, к моменту выполнения запроса оно может не завершиться.

Попробуйте перевести сон в течение одной или двух секунд после создания индекса и посмотрите, не изменит ли это результаты.

...