2011-01-13 5 views
3

Я попытался запустить демо на http://www.riptano.com/blog/whats-new-cassandra-07-secondary-indexes программно, но результаты отличаются от его запуска в CLI. Кажется, что Cassandra может индексировать столбцы только после добавления индекса. Все предыдущие данные остаются без изменений.Как программно добавить индекс в Cassandra 0.7

Полный исходный код, как показано ниже: -

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 

ответ

1

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

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

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

0

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

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

+0

Пробовал с помощью 2 минут. Все тот же результат. Благодарю. – tanyehzheng

+0

Было ли предложение Джонатана Эллиса внизу комментариев здесь работать на вас? : http://www.riptano.com/blog/whats-new-cassandra-07-secondary-indexes –

+0

Нет. Я изменил все getBytes на getBytes («UTF-8»), но он все еще не работает. Я просил также список рассылки пользователей cassandra, но только один человек ответил через 3 дня. :( – tanyehzheng