It’s inevitable that as you develop applications, clients and users will want searching added. Completely inevitable. What happens when you need to extend beyond searching fields that are saved on your models? There’s also the ever present need to keep things scalable. Having a solution that grows with you and isn’t tied 100% to your schema can not only impress, but save you time in the long run. Check out Solr, the incredibly powerful search solution from Apache. In this article, I’ll show you how to set it up and how to do a basic search.

Set It Up

Check out the Sunspot gem and read the docs. The following instructions are for setting this up on a development machine that runs Foreman (I highly recommend using this if you don’t already).

Gemfile.rb

gem 'sunspot_rails'

group :development, :test
  gem 'sunspot_solr'
end
Procfile.dev

solr: bundle exec rake sunspot:solr:run

The Sunspot Solr gem saves you from having to install Solr separately, which gets you up and running quicker. Adding the above to your dev Procfile starts up Solr with your app. Just a few more easy steps and you’re off to the races.

Model Changes

Given a Car model, the following will allow for some basic searching to try out Solr:

class Car < ActiveRecord::Base
# id                        :integer          not null, primary key
# mileage                   :integer          not null, default: 0
# make                      :string
# model                     :string

  searchable do
    string :make
    string :model
    integer :mileage
  end
end

That’s the minimal setup to search the :make, :model, :mileage attributes on Car. After you add that, run the following from a console to reindex your Cars. If you don’t, Solr won’t have any search documents created for Car and you won’t get any search results returned.

Car.solr_index

Any time you make changes to the searchable block, you’ll need to reindex if you want your changes to be picked up. Like any properly designed caching system any time you save or update a car, there’s a sunspot callback which updates the cache.

The Final Product

At this point, your cache is warmed up and the cars are ready to be searched.

search = Car.solr_search do
  with(:make, "Chevrolet")
end

search.results.each {|result| puts r.model}

This example returns a search which will pull all results for Chevrolets and then prints out all the models. Add more with lines to further refine it. As a side note, sunspot returns paginated searches with only 30 results at a time; don’t wonder WTF is happening if there should be more results, check the next page.

Some helpful methods to get you started: search.total #count of the total results search.total_pages #count of how many pages of results search.results #the actual page of results

This is far from comprehensive, but it’s a great start to get you up and running with Solr. A big technology that’s got a shallow learning curve. Perfect for jumping in to a dedicated search solution. There will be more posts to follow with advanced ways to use this tech.