キーをランダムに生成
POSTを使います。
$ curl -i -X POST http://localhost:8098/buckets/spam/keys -d "dada" HTTP/1.1 201 Created Vary: Accept-Encoding Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue) Location: /buckets/spam/keys/GO6judbI9AXnO7j8AYDLnP0Xl5S Date: Sun, 17 Mar 2013 03:03:26 GMT Content-Type: application/x-www-form-urlencoded Content-Length: 0 $ curl http://localhost:8098/buckets/spam/keys/GO6judbI9AXnO7j8AYDLnP0Xl5S dada%
pbインターフェースだとどうなるんだろう。
2i(secondary index)をはる
$ curl -i -X POST http://localhost:8098/buckets/spam/keys -d '{"name":"john smith"}' -H "x-riak-index-name_bin: john" HTTP/1.1 201 Created Vary: Accept-Encoding Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue) Location: /buckets/spam/keys/FZBnJO4frJUrnhVTg7w8ldvwnpQ Date: Sun, 17 Mar 2013 03:08:22 GMT Content-Type: application/x-www-form-urlencoded Content-Length: 0 $ curl -i http://localhost:8098/buckets/spam/keys/FZBnJO4frJUrnhVTg7w8ldvwnpQ HTTP/1.1 200 OK X-Riak-Vclock: a85hYGBgzGDKBVIcypz/fga6qgpnMCUy5rEyLFu/8xRfFgA= x-riak-index-name_bin: john Vary: Accept-Encoding Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue) Link: </buckets/spam>; rel="up" Last-Modified: Sun, 17 Mar 2013 03:08:22 GMT ETag: "5uqM42uhR9BjEZqgwaEKfm" Date: Sun, 17 Mar 2013 03:08:48 GMT Content-Type: application/x-www-form-urlencoded Content-Length: 21 {"name":"john smith"}% $ curl -i http://localhost:8098/buckets/spam/index/name_bin/john HTTP/1.1 200 OK Vary: Accept-Encoding Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue) Date: Sun, 17 Mar 2013 03:09:24 GMT Content-Type: application/json Content-Length: 40 {"keys":["FZBnJO4frJUrnhVTg7w8ldvwnpQ"]}%
これでnameというインデックスにjohnが着いている人が全員とってこれるようになる。
2i+MapReduce
これをMapReduceのinputにすることもできる。
$ curl -X POST -H "content-type: application/json" -d @- http://localhost:8098/mapred \ <<EOF { "inputs":{ "bucket":"spam", "index":"name_bin", "key":"john" }, "query":[ { "reduce":{ "language":"erlang", "module":"riak_kv_mapreduce", "function":"reduce_identity", "keep":true } } ] } EOF [["spam","FZBnJO4frJUrnhVTg7w8ldvwnpQ"],["spam","90rrJwJvKEKDMGy9YQFrrcyhZhu"]]%
帰ってくるのは、bucket名とKeyのペアのようだ。こいつを使えば、mapredを2回呼べばJOINのようなクエリも発行できるだろうとは思う。
しかし2iに注意してほしいのは、そんなに効率のよい実装になっているわけではない(そもそも分散データベースでインデックスというのはトランザクショナルになりかねないのであって…)ので秒間数千とかそういうオーダーでの性能は期待できない。HBaseやCassandraと同じでキーの設計は慎重に。
それぞれの言語のライブラリをどう叩くかは、各言語のリファレンスにある程度サンプルがあるはずなので参考にしてもらいたい。基本的には上記のようなインターフェースがベースにあるので、APIはある程度似通ってくるだろう。