Riak 2i - 更新删除二级索引

时间:2016-01-11 00:38:47

标签: java riak riak-2i

我正在使用oficial Riak Java客户端v2.0.2。当我更新以前写入的值(使用2i索引)时,不会保留二级索引。

这是我更新的方式:

Location location = new Location(this.namespace, key);
UpdateValue updateOp = new UpdateValue.Builder(location)
        .withFetchOption(FetchValue.Option.DELETED_VCLOCK, true)
        .withUpdate(new RiakKVUpdateValue(values))
        .build();

这是我的更新课程:

public class RiakKVUpdateValue extends Update<Map<String, String>> {

    private final Map<String, String> value;

    public RiakKVUpdateValue(HashMap<String, ByteIterator> values) {
        this.value = StringByteIterator.getStringMap(values);
    }

    @Override
    public Map<String, String> apply(Map<String, String> original) {
        return this.value;
    }
}

我还没有在有关使用2i索引更新对象的文档中找到任何内容。

  • 我做错了吗?
  • 我应该手动阅读/修改/写入吗?

1 个答案:

答案 0 :(得分:3)

每次更新值时都必须获取索引并将其写回。见2i Indexing an Object

我建议创建一个字段来保存索引并使用@RiakIndex对其进行注释。使用此注释注释的字段在获取时由Java客户端自动填充2i值。然后,将其值复制到RiakKVUpdateValue.apply()以保留它。或者,如前所述,获取然后在两个单独的命令中写回。这将允许您控制要写回的元数据。别忘了填充VClocks。

P.S。自动保留2i可能是个坏主意,因为用户想要保留旧的2i值并不明显。我相信这就是由用户决定的原因。