Skip to content

Instantly share code, notes, and snippets.

@holtbp
Last active May 18, 2016 23:18
Show Gist options
  • Save holtbp/65a0f05a781ddbf6e0f8524c31e7016c to your computer and use it in GitHub Desktop.
Save holtbp/65a0f05a781ddbf6e0f8524c31e7016c to your computer and use it in GitHub Desktop.
Intro to Using Riak Search 2.0

Intro

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.

Enable Riak Search

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">>

Bucket & Index Setup

# 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"}}'

Inserting Data

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.

Ruby Client

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

Elixir Client

Searching Data

Now that we have inserted some celebrity customers into our bucket, let's do some searching.

Ruby Client

# 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"}]}

Elixir Client

# 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}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment