在Cassandra上添加二级索引索引历史数据?

时间:2014-02-10 20:04:03

标签: indexing nosql cassandra hector pycassa

如果在特定的列族中,我稍后会在列上添加索引,它也将索引历史数据或者在添加索引后立即生成数据。

此处When does Cassandra DB index data after updating a column as secondary index 接受的答案表明它只会索引创建索引后插入的数据。

我尝试在列上创建带索引的CF。(我正在使用Cassandra 1.0.7)

使用comparator = UTF8Type创建列族系列用户 和column_metadata = [{column_name:full_name,validation_class:UTF8Type}, {column_name:birth_date,validation_class:LongType,index_type:KEYS}, {column_name:state,validation_class:UTF8Type,index_type:KEYS}];

添加了一些数据,然后

逐条删除索引users.birth_date 然后通过更新CF

将其添加回来

使用comparator = UTF8Type更新列族系列用户 和column_metadata = [{column_name:full_name,validation_class:UTF8Type}, {column_name:birth_date,validation_class:LongType,index_type:KEYS}, {column_name:state,validation_class:UTF8Type,index_type:KEYS}];

然后再添加一些数据

但是当我在查询birth_data时,我也得到了历史数据?

有人可以清楚我对此的困惑吗? 有两种创建索引的方法,一种是历史数据,一种是没有?

1 个答案:

答案 0 :(得分:1)

也许以前版本的Cassandra没有为历史数据构建索引,但根据Cassandra 1.2的代码,索引创建是一个异步过程,如果添加二级索引,它会在历史数据上发生:

https://github.com/apache/cassandra/blob/cassandra-1.2.15/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java#L240

在您的方案中,发生的情况是您删除了索引并添加了索引。由于旧的索引文件已经加载但未从磁盘中删除,因此Cassandra将它们连接起来再次使用。否则,它会尝试创建它们。

如果您不确定二级索引是否同步,可以使用:

nodetool rebuild_index