Riak:通过Java / Scala创建密钥索引

时间:2014-06-27 10:06:39

标签: java scala indexing riak

我在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之类的注释,只能查看值。

2 个答案:

答案 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