1

我正在尝试使用JavaSecondary Indexes在RiakMap/Reduce上实现一个功能。具体来说,我正在尝试根据特定索引键实现条件 + 排序结果。该函数将用于拥挤的桶中(以亿级存储项目的顺序AND

虽然 Riak 本身并不支持AND条件和排序,但我想听听关于如何实现这一点的不同观点(考虑到如此大存储桶上的性能问题)。

假设我有以下数据:

key: key1
index-field1_bin: car
index-field2_int: 1

key: key2
index-field1_bin: car
index-field2_int: 3

key: key3
index-field1_bin: bike
index-field2_int: 4

key: key4
index-field1_bin: car
index-field2_int: 2

在 Java 中,您将如何检索满足以下条件的项目:

index-field1_bin == car
3 <= index-field2_int <= 4

然后将它们排序为index-field2_int ASC.

谢谢

4

1 回答 1

2

我可能已经找到了解决方案,但我仍然需要对其进行一些认真的基准测试。

IndexQuery iq = new BinValueQuery(BinIndex.named("field1"),
        "bucketName", "car");
Function mapFunction = new JSSourceFunction(
        "function(v) {" +
            "var range = v.values[0].metadata.index.field2;" +
            "if (range <= 4 && range >= 2) {" +
                "return [v.values[0]];" +
            "}" +
            "return [];" +
        "}");
Function reduceFunction = new JSSourceFunction(
        "function(v) {" +
            "return [v.sort(function(a, b) {" +
                                 "return a.metadata.index.field2 - b.metadata.index.field2;" +
                            "}" +
                     ")];" +
         "}");
MapReduceResult result = RiakUtils.getClient().mapReduce(iq)
                            .addMapPhase(mapFunction)
                            .addReducePhase(reduceFunction)
                            .execute();

// Print the results
System.out.println(result.getResultRaw());

基本上,一个查询获取所有“汽车”项目,然后我使用它们的范围(地图)过滤这些项目并通过MapReduce操作对它们进行排序(减少)。

于 2012-05-20T02:22:55.223 回答