1

Javaセカンダリインデックスを使用してRiakMap/Reduceに関数を実装しようとしています。具体的には、特定のインデックスキーで条件と結果の並べ替えを実装しようとしています。この関数は、混雑したバケットで使用されます(1億個の保存済みアイテムのオーダー)。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 に答える