【问题标题】:Riak: Create index on key via Java/ScalaRiak:通过 Java/Scala 在键上创建索引
【发布时间】:2014-06-27 10:06:38
【问题描述】:

我在 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 字符串。有什么办法可以做到这一点?执行store时看不到任何index(name)方法,也看不到像@RiakKey这样的注解,除了值。

【问题讨论】:

    标签: java scala indexing riak


    【解决方案1】:

    您可以使用 RiakObjectBuilder 创建一个 RiakObject,然后在其上添加索引:

    val obj = RiakObjectBuilder.newBuilder(bucketName, myKey)
          .withValue(myValue)
          .addIndex("timestamp_index", timestamp)
          .build
    myBucket.store(obj).execute
    

    【讨论】:

      【解决方案2】:

      如果我了解您要做什么,您希望键/值对 "1403909549"/"Some Value"timestamp_index="1403909549" 索引,以便您可以查询特定时间或时间范围。

      如果是这种情况,您不需要显式添加索引,您可以像查询任何其他索引一样查询隐式索引$KEY

      由于 Riak 存储在 LevelDB 中的所有键都被隐式索引,我认为没有公开方法来再次显式索引它们。

      【讨论】:

      • 嗨,乔,谢谢你的回答,我不知道隐含的 $KEY 索引,为此 +1。如果我必须仅将这些 Timestamp -> String 值存储在 myBucket 中,您的解决方案将起作用,但不幸的是,我有其他具有不同语义的键,我不想在查询 timestamp_index 时考虑这些键
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多