在RIAK mapred中一起使用二级索引和密钥过滤器

时间:2012-10-18 21:22:10

标签: riak

可以在map reduce查询中一起使用sec索引和键过滤器。像这样的东西

*{"inputs":{ "bucket"     :"ignore_bucket1",
    "index"      :"secindex_bin",
    "key"        :"secIndexVal",
    "key_filters":[["and",
                  [["tokenize", "-", 5], ["greater_than_eq", "20120101"]],
                  [["tokenize", "-", 5], ["less_than_eq", "20120112"]]
    ]]
}} 

使用sec index获取密钥列表然后在返回的密钥上运行keyfilter也是有效的吗?

2 个答案:

答案 0 :(得分:1)

据我所知,不可能在输入语句中将它们组合在一起,因为它们代表了非常不同的检索键的方式。通过使用二级索引检索初始集(避免扫描所有键)然后将密钥过滤逻辑实现为映射阶段函数,可以按照您的建议实现这一点。

绕过它的另一种可能更快的方法可能是创建一个额外的复合二进制二级索引,例如: [secIndexVal] _ [日期]。如果确保正确排序,则可以对此运行单个二级索引范围查询并获取上面指定的值。

答案 1 :(得分:0)

Afaik你不能通过HTTP api

来做到这一点

正如Christian所提到的,您可以使用范围查询,但是您不需要替代索引,因为您已经拥有主键索引,可以由$key作为索引字段引用:

olav@nyx ~ (master *%) » curl http://nyx:8098/riak/test/20120931 -d "31. Sep 2012"
olav@nyx ~ (master *%) » curl http://nyx:8098/riak/test/20121002 -d "02. Oct 2012"
olav@nyx ~ (master *%) » curl http://nyx:8098/riak/test/20121021 -d "21. Oct 2012
olav@nyx ~ (master *%) » curl http://nyx:8098/riak/test/20121102 -d "The future"     
olav@nyx ~ (master *%) » curl -X POST -H "content-type: application/json" \
-d @- http://localhost:8098/mapred \
<<EOF
{ "inputs":{
      "bucket":"test"
    , "index":"\$key"
    , "start":"20121001"
    , "end":"20121101"
}
, "query":[{
      "reduce":{
           "language":"erlang"
         , "module":"riak_kv_mapreduce"
         , "function":"reduce_identity"
         , "keep":true
      }
  }]
}
EOF
# ...
[["test","20121021"],["test","20121002"]]

如果您真的想要使用密钥过滤器,可以使用Erlang pb客户端并沿着这些行执行某些操作(在代码路径中需要riak_kv):

{ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087),
Index = {index, <<"test1">>, <<"field_int">>, <<"123">>},
{ok, Filter} = riak_kv_mapred_filters:build_filter([[<<"ends_with">>,"1"]]).
MapReduce = [
   { reduce
  , {qfun, fun(X, F) -> lists:filter(fun({A, B}) -> F(B) end, X) end}
  , riak_kv_mapred_filters:compose(Filter)
  , true}],
riakc_pb_socket:mapred(Pid, Index, MapReduce).