Как программно создать вторичный индекс в Cassandra Hector API

Я пытался создать индексацию, используя ниже набор строк.

 KeyspaceDefinition fromCluster = cluster.describeKeyspace(KEYSPACE);
 ColumnFamilyDefinition cfDef = fromCluster.getCfDefs().get(0);
 BasicColumnFamilyDefinition columnFamilyDefinition = newBasicColumnFamilyDefinition(cfDef); 
 BasicColumnDefinition columnDefinition = new BasicColumnDefinition();
 columnDefinition.setName(StringSerializer.get().toByteBuffer("A_NO"));    
 columnDefinition.setIndexName("A_NO_idx");
 columnDefinition.setIndexType(ColumnIndexType.KEYS);   
 columnDefinition.setValidationClass(ComparatorType.UTF8TYPE.getClassName());
 columnFamilyDefinition.addColumnDefinition(columnDefinition);

Но я не могу этого сделать. На самом деле я храню данные в столбцах динамически, а также создаю эти столбцы динамически, и после этого для лучшей цели запроса я пытаюсь поместить индекс в некоторые конкретные столбцы. Любое предложение, пожалуйста, как это сделать.

1 ответ

Решение

Это в конечном итоге довольно просто. Вам просто нужно создать вторичный индекс при определении семейства столбцов. В приведенном выше коде все манипуляции выполняются для индекса объекта, который должен быть создан при определении только. Шаги для добавления индекса:

    List<ColumnDef> columns = new ArrayList<ColumnDef>();
    columns.add(newIndexedColumnDef("columnName", "UTF8Type"));
    List<ColumnDefinition> columnMetadata = ThriftColumnDef
            .fromThriftList(columns);
    cdefs.add(cf_def);    //cf_def is your columnfamily definition

Код вспомогательного метода взят из KeyspaceCreationTest

    public ColumnDef newIndexedColumnDef(String     column_name, String     comparer){
        ColumnDef cd = new ColumnDef(se.toByteBuffer(column_name), comparer);
        cd.setIndex_name(column_name);
        cd.setIndex_type(IndexType.KEYS);
        return cd;
    }       

Ссылки для сравнения можно найти здесь

Я надеюсь, что это поможет вам.

Другие вопросы по тегам