1

可以在 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 索引获取键列表然后在返回的键上运行 keyfilter 是否有效?

4

2 回答 2

1

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

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

于 2012-10-19T08:28:01.377 回答
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).
于 2012-10-29T19:28:43.250 回答