Как программно создать вторичный индекс в 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;
}
Ссылки для сравнения можно найти здесь
Я надеюсь, что это поможет вам.