This guide assumes you have Riak KV installed and running on port 8087
. This guide walks through enabling Riak Search, enabling bucket-types, creating indices, inserting data, and searching data.
To enable Riak Search, which uses Solr, you will need to install Java.
To install Java:
brew tap caskroom/cask
brew install brew-cask
brew cask install java
Now, update the riak.conf
to turn on the search feature:
search = on
Restart Riak:
riak restart
And to confirm, check the output of the following command for search settings:
$ riak-admin status | grep search
search_index_fail_count : 0
search_index_fail_one : 0
search_index_latency_95 : 0
search_index_latency_99 : 0
search_index_latency_999 : 0
search_index_latency_max : 0
search_index_latency_mean : 0
search_index_latency_median : 0
search_index_latency_min : 0
search_index_throughput_count : 0
search_index_throughput_one : 0
search_query_fail_count : 0
search_query_fail_one : 0
search_query_latency_95 : 0
search_query_latency_99 : 0
search_query_latency_999 : 0
search_query_latency_max : 0
search_query_latency_mean : 0
search_query_latency_median : 0
search_query_latency_min : 0
search_query_throughput_count : 0
search_query_throughput_one : 0
riak_search_version : <<"2.1.1-0-gffe2113">>
# Create Map bucket-type
riak-admin bucket-type create maps '{"props":{"datatype":"map"}}'
# Check to make sure the properties are as expected
riak-admin bucket-type status maps
# Activate the bucket-type
riak-admin bucket-type activate maps
# Set Riak API HOST
export RIAK_HOST=http://localhost:8098
# Create a search index
curl -XPUT $RIAK_HOST/search/index/customers \
-H 'Content-Type: application/json' \
-d '{"schema":"_yz_default"}'
# Set search index for Map bucket-type
riak-admin bucket-type update maps '{"props":{"search_index":"customers"}}'
I decided to use the Ruby and Elixir clients for this part, however, there are many options to interface with Riak. I found the Ruby gem to be well documented with examples.
First, data needs to be inserted into a bucket:
irb(main):001:0> require 'riak'
irb(main):002:0> client = Riak::Client.new
irb(main):003:0> bucket = client.bucket('customers')
irb(main):005:0> idris_elba = Riak::Crdt::Map.new(bucket, 'idris_elba', 'maps')
irb(main):006:0> idris_elba.batch do |ie|
irb(main):007:1* ie.registers['first_name'] = 'Idris'
irb(main):008:1> ie.registers['last_name'] = 'Elba'
irb(main):009:1> ie.flags['enterprise_customer'] = true
irb(main):010:1> ie.counters['page_visits'].increment(10)
irb(main):011:1> ['acting', 'being Stringer Bell'].each do |interest|
irb(main):012:2* ie.sets['interests'].add(interest)
irb(main):013:2> end
irb(main):014:1> end
irb(main):015:0> joan_jett = Riak::Crdt::Map.new(bucket, 'joan_jett', 'maps')
irb(main):016:0> joan_jett.batch do |jj|
irb(main):017:1* jj.registers['first_name'] = 'Joan'
irb(main):018:1> jj.registers['last_name'] = 'Jett'
irb(main):019:1> ## Joan Jett is not an enterprise customers, so we don't need to
irb(main):020:1* ## explicitly disable this flag, as all flags are disabled by default
irb(main):021:1* jj.counters['page_visits'].increment(25)
irb(main):022:1> ['loving rock and roll', 'being in the Blackhearts'].each do |interest|
irb(main):023:2* jj.sets['interests'].add(interest)
irb(main):024:2> end
irb(main):025:1> end
Now that we have inserted some celebrity customers into our bucket, let's do some searching.
# You can search for ranges with counter types.
irb(main):026:0> client.search('customers', 'page_visits_counter:[15 TO *]')
=> {"max_score"=>1.0, "num_found"=>1, "docs"=>[{"score"=>"1.00000000000000000000e+00", "_yz_rb"=>"customers", "_yz_rt"=>"maps", "_yz_rk"=>"joan_jett", "_yz_id"=>"1*maps*customers*joan_jett*48", "first_name_register"=>"Joan", "interests_set"=>"loving rock and roll", "last_name_register"=>"Jett", "page_visits_counter"=>"25"}]}
irb(main):027:0> client.search('customers', 'page_visits_counter:[10 TO 35]')
=> {"max_score"=>1.0, "num_found"=>2, "docs"=>[{"score"=>"1.00000000000000000000e+00", "_yz_rb"=>"customers", "_yz_rt"=>"maps", "_yz_rk"=>"idris_elba", "_yz_id"=>"1*maps*customers*idris_elba*61", "enterprise_customer_flag"=>"true", "first_name_register"=>"Idris", "interests_set"=>"being Stringer Bell", "last_name_register"=>"Elba", "page_visits_counter"=>"10"}, {"score"=>"1.00000000000000000000e+00", "_yz_rb"=>"customers", "_yz_rt"=>"maps", "_yz_rk"=>"joan_jett", "_yz_id"=>"1*maps*customers*joan_jett*49", "first_name_register"=>"Joan", "interests_set"=>"loving rock and roll", "last_name_register"=>"Jett", "page_visits_counter"=>"25"}]}
# You can also search by registers, and use wildcards.
irb(main):028:0> client.search('customers', 'first_name_register:*')
=> {"max_score"=>1.0, "num_found"=>2, "docs"=>[{"score"=>"1.00000000000000000000e+00", "_yz_rb"=>"customers", "_yz_rt"=>"maps", "_yz_rk"=>"idris_elba", "_yz_id"=>"1*maps*customers*idris_elba*59", "enterprise_customer_flag"=>"true", "first_name_register"=>"Idris", "interests_set"=>"being Stringer Bell", "last_name_register"=>"Elba", "page_visits_counter"=>"10"}, {"score"=>"1.00000000000000000000e+00", "_yz_rb"=>"customers", "_yz_rt"=>"maps", "_yz_rk"=>"joan_jett", "_yz_id"=>"1*maps*customers*joan_jett*47", "first_name_register"=>"Joan", "interests_set"=>"loving rock and roll", "last_name_register"=>"Jett", "page_visits_counter"=>"25"}]}
irb(main):029:0> client.search('customers', 'first_name_register:J*')
=> {"max_score"=>1.0, "num_found"=>1, "docs"=>[{"score"=>"1.00000000000000000000e+00", "_yz_rb"=>"customers", "_yz_rt"=>"maps", "_yz_rk"=>"joan_jett", "_yz_id"=>"1*maps*customers*joan_jett*49", "first_name_register"=>"Joan", "interests_set"=>"loving rock and roll", "last_name_register"=>"Jett", "page_visits_counter"=>"25"}]}
# Open connection, assign pid
pry(1)> {:ok, pid} = Riak.Connection.start_link('127.0.0.1', 8087)
{:ok, #PID<0.379.0>}
# You can search for ranges with counter types.
pry(2)> Riak.Search.query(pid, "customers", "page_visits_counter:[15 TO *]")
{:ok,
{:search_results,
[{"customers",
[{"score", "1.00000000000000000000e+00"}, {"_yz_rb", "customers"},
{"_yz_rt", "maps"}, {"_yz_rk", "joan_jett"},
{"_yz_id", "1*maps*customers*joan_jett*49"}, {"first_name_register", "Joan"},
{"interests_set", "being in the Blackhearts"},
{"interests_set", "loving rock and roll"}, {"last_name_register", "Jett"},
{"page_visits_counter", "25"}]}], 1.0, 1}}
pry(3)> Riak.Search.query(pid, "customers", "page_visits_counter:[10 TO 35]")
{:ok,
{:search_results,
[{"customers",
[{"score", "1.00000000000000000000e+00"}, {"_yz_rb", "customers"},
{"_yz_rt", "maps"}, {"_yz_rk", "idris_elba"},
{"_yz_id", "1*maps*customers*idris_elba*61"},
{"enterprise_customer_flag", "true"}, {"first_name_register", "Idris"},
{"interests_set", "acting"}, {"interests_set", "being Stringer Bell"},
{"last_name_register", "Elba"}, {"page_visits_counter", "10"}]},
{"customers",
[{"score", "1.00000000000000000000e+00"}, {"_yz_rb", "customers"},
{"_yz_rt", "maps"}, {"_yz_rk", "joan_jett"},
{"_yz_id", "1*maps*customers*joan_jett*49"}, {"first_name_register", "Joan"},
{"interests_set", "being in the Blackhearts"},
{"interests_set", "loving rock and roll"}, {"last_name_register", "Jett"},
{"page_visits_counter", "25"}]}], 1.0, 2}}
# You can also search by registers, and use wildcards.
pry(4)> Riak.Search.query(pid, "customers", "first_name_register:*")
{:ok,
{:search_results,
[{"customers",
[{"score", "1.00000000000000000000e+00"}, {"_yz_rb", "customers"},
{"_yz_rt", "maps"}, {"_yz_rk", "idris_elba"},
{"_yz_id", "1*maps*customers*idris_elba*61"},
{"enterprise_customer_flag", "true"}, {"first_name_register", "Idris"},
{"interests_set", "acting"}, {"interests_set", "being Stringer Bell"},
{"last_name_register", "Elba"}, {"page_visits_counter", "10"}]},
{"customers",
[{"score", "1.00000000000000000000e+00"}, {"_yz_rb", "customers"},
{"_yz_rt", "maps"}, {"_yz_rk", "joan_jett"},
{"_yz_id", "1*maps*customers*joan_jett*49"}, {"first_name_register", "Joan"},
{"interests_set", "being in the Blackhearts"},
{"interests_set", "loving rock and roll"}, {"last_name_register", "Jett"},
{"page_visits_counter", "25"}]}], 1.0, 2}}
pry(5)> Riak.Search.query(pid, "customers", "first_name_register:J*")
{:ok,
{:search_results,
[{"customers",
[{"score", "1.00000000000000000000e+00"}, {"_yz_rb", "customers"},
{"_yz_rt", "maps"}, {"_yz_rk", "joan_jett"},
{"_yz_id", "1*maps*customers*joan_jett*48"}, {"first_name_register", "Joan"},
{"interests_set", "being in the Blackhearts"},
{"interests_set", "loving rock and roll"}, {"last_name_register", "Jett"},
{"page_visits_counter", "25"}]}], 1.0, 1}}