我正在尝试使用 Java 和二级索引在 Riak 上实现Map/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
。
由于
答案 0 :(得分: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
操作对它们进行排序(缩小)。