我在riak上有一个存储桶,我以这种方式存储简单的Timestamp -> String
值:
val riakClient = RiakFactory.newClient(myHttpClusterConfig)
val myBucket = riakClient.fetchBucket(name).execute
myBucket.store(timestamp.toString, value).withoutFetch().w(1).execute
我现在需要做的是在键上添加索引。我尝试用这种方式定义Java POJO:
public class MyWrapper {
@RiakIndex(name="timestamp_index")
@RiakKey
public String timestamp;
public String value;
public MyWrapper(String timestamp, String value) {
this.timestamp = timestamp;
this.value = value;
}
}
然后运行
myBucket.store(new MyWrapper(timestamp.toString, value)).withoutFetch().w(1).execute
这种方法的问题在于,在riak中,实际值存储为json对象:
{"value":"myvalue"}
虽然我只需要存储myvalue
字符串。有没有办法实现这个目标?在执行index(name)
时,我看不到任何store
方法,我看不到@RiakKey
之类的注释,只能查看值。
答案 0 :(得分:1)
如果我了解您要执行的操作,您希望将键值/值对"1403909549"
/ "Some Value"
编入索引timestamp_index="1403909549"
,以便查询特定时间或范围次。
如果是这种情况,您不需要显式添加索引,您可以使用与任何其他索引相同的方式查询隐式索引$KEY
。
由于Riak存储在LevelDB中的所有密钥都是隐式索引的,因此我不认为有一种方法可以显式地对它们进行索引。
答案 1 :(得分:1)
您可以使用Riak ObjectBuilder创建Riak对象,然后在其上添加索引:
val obj = RiakObjectBuilder.newBuilder(bucketName, myKey)
.withValue(myValue)
.addIndex("timestamp_index", timestamp)
.build
myBucket.store(obj).execute