官方文档
http://wiki.basho.com/Secondary-Indexes.html#Indexing-an-Object
在看官方文档时,描述的例子都是用crul描述的,而我是用的riak_erlang_client 只能看api尝试调用了
new/3方法中是提供不了索引的,不过有个update_medadata/2方法 可以根据这个方法插入数据,
我首先写入一个K-V,再立刻读取它,获取的medadata其实是一个dict(),在dict 中插入index,最后写入书库就实现了。
查询的时候用get_index/4即可
过程:
(ejabberd@meta)22> Bucket= <<"user">> .
<<"user">>
(ejabberd@meta)23> Key= <<"langxw">>.
<<"langxw">>
(ejabberd@meta)24> Value= term_to_binary({"jason","29","male"}).
<<131,104,3,107,0,5,106,97,115,111,110,107,0,2,50,57,107,
0,4,109,97,108,101>>
(ejabberd@meta)25> Age="29".
"29"
(ejabberd@meta)26> ObN=riakc_obj:new(Bucket, Key, Value). 根据Bucket,Key,Value构造数据
{riakc_obj,<<"user">>,<<"langxw">>,undefined,[],undefined,
<<131,104,3,107,0,5,106,97,115,111,110,107,0,2,50,57,107,
0,4,109,97,108,...>>}
(ejabberd@meta)28> f(Pid), {ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087).
{ok,<0.582.0>}
(ejabberd@meta)29> riakc_pb_socket:put(Pid,ObN). 把数据写入数据库
ok
(ejabberd@meta)30> {ok, ObR}=riakc_pb_socket:get(Pid,Bucket,Key). 再根据键值读出数据
{ok,{riakc_obj,<<"user">>,<<"langxw">>,
<<107,206,97,96,96,96,204,96,202,5,82,28,202,156,255,126,
250,223,188,122,42,131,41,...>>,
[{{dict,2,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],[],...}}},
<<131,104,3,107,0,5,106,97,115,111,110,107,0,2,50,57,
107,0,4,...>>}],
undefined,undefined}}
(ejabberd@meta)31> Dict = riakc_obj:get_metadata(ObR) 得到metadata数据
(ejabberd@meta)31> .
{dict,2,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],
[[<<"X-Riak-VTag">>,49,100,75,89,57,82|...]],
[],[],
[[<<"X-Riak-Last-"...>>|{1341,393029,...}]],
[],[]}}}
(ejabberd@meta)32> DictN=di
dict disk_log disk_log_1 disk_log_server
disk_log_sup
(ejabberd@meta)32> DictN=dict:store( <<"index">>, [{"age_ing","29"}], Dict). 构造index
{dict,3,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],
[[<<"X-Riak-VTag">>,49,100,75,89,57,82|...]],
[[<<"index">>,{"age_ing","29"}]],
[],
[[<<"X-Riak-Last-"...>>|{1341,393029,...}]],
[],[]}}}
(ejabberd@meta)33> ObRN=riakc_obj:update_metadata(ObR,DictN). 构造数据
{riakc_obj,<<"user">>,<<"langxw">>,
<<107,206,97,96,96,96,204,96,202,5,82,28,202,156,255,126,
250,223,188,122,42,131,41,145,49,...>>,
[{{dict,2,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],[],[[...]],[],...}}},
<<131,104,3,107,0,5,106,97,115,111,110,107,0,2,50,57,
107,0,4,109,97,...>>}],
{dict,3,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],[],
[[<<...>>|...]],
[[...]],
[],...}}},
undefined}
(ejabberd@meta)34> riakc_pb_socket:put(Pid, ObRN).
{error,<<"{precommit_fail,[{unknown_field_type,<<\"age_ing\">>}]}">>}再次写入数据 int写成 ing所以写入失败
(ejabberd@meta)35> f(DictN),DictN=dict:store( <<"index">>, [{"age_int","29"}], Dict).
{dict,3,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],
[[<<"X-Riak-VTag">>,49,100,75,89,57,82|...]],
[[<<"index">>,{"age_int","29"}]],
[],
[[<<"X-Riak-Last-"...>>|{1341,393029,...}]],
[],[]}}}
(ejabberd@meta)36> f(ObRN),ObRN=riakc_obj:update_metadata(ObR,DictN). 修正后再次写入
{riakc_obj,<<"user">>,<<"langxw">>,
<<107,206,97,96,96,96,204,96,202,5,82,28,202,156,255,126,
250,223,188,122,42,131,41,145,49,...>>,
[{{dict,2,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],[],[[...]],[],...}}},
<<131,104,3,107,0,5,106,97,115,111,110,107,0,2,50,57,
107,0,4,109,97,...>>}],
{dict,3,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],[],
[[<<...>>|...]],
[[...]],
[],...}}},
undefined}
(ejabberd@meta)37> riakc_pb_socket:put(Pid, ObRN).
ok
(ejabberd@meta)38> riakc_pb
riakc_pb riakc_pb_socket
(ejabberd@meta)38> riakc_pb_socket:get_index(Pid, Bucket, <<"age_int">>, 29). 验证写入是否成功,OK 啦
{ok,[[<<"user">>,<<"langxw">>]]}
(ejabberd@meta)39> Key.
<<"langxw">>
(ejabberd@meta)40>