1

マップリデュースクエリで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を実行するのは効率的ですか?

4

2 に答える 2

1

私の知る限り、これらはキーを取得する非常に異なる方法を表しているため、入力ステートメントでこれらを組み合わせることはできません。セカンダリインデックスを使用して初期セットを取得し(すべてのキーのスキャンを回避)、キーフィルタリングロジックをマップフェーズ関数として実装することで、これを実装することができます。

それを回避する別の、おそらくより速い方法は、おそらく[secIndexVal]_[date]のような追加の複合バイナリセカンダリインデックスを作成することかもしれません。これが正しくソートされることが保証されている場合は、これに対して単一のセカンダリインデックス範囲クエリを実行し、上記で指定した値を取得できます。

于 2012-10-19T08:28:01.377 に答える
0

Afaikは、HTTPAPIを介してこれを行うことはできません。

$keyChristianが述べたように、範囲クエリを使用できますが、インデックスフィールドとして参照できる主キーインデックスがすでにあるため、代替インデックスは必要ありません。

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 に答える