Apache Solr and Rails
To integrate the Apache-Solr search engine into Ruby and Rails, the Sunspot library provides an interactive technique. Sunspot is built on top of the RSolr library, which provides a low-level interface for Solr interaction; Sunspot manages the configuration of persistent Ruby classes for search and indexing and exposes Solr's most powerful features through a collection of DSLs. Complex search operations can be performed without hand-writing any boolean queries or building Solr parameters by hand. Sunspot is designed to be easily plugged into any Object-relational mapping, or even non-database-backed objects such as the filesystem. Sunspot is distributed under the MIT License.
Installation
Sunspot is easily configurable with RubyGems, type in the following command in Gems.
$ gem install sunspot
If you use an alternate system of package management, you can pull Sunspot from git://github.com/outoftime/sunspot.git .
Getting Started
Sunspot comes with a prepackaged instance of Solr, which makes it easy to get started in development mode. To start Sunspot's Solr instance, run:
$ gem install sunspot_solr # not required for Sunspot < 1.3.0 $ sunspot-solr start
[1] This will store the index data in your operating system's temporary directory – see Configuring Solr for use with Sunspot in development, testing, and production for more options available when running the packaged Solr instance.
Configuration
Sunspot is configured using the Sunspot.config object. The following options are available:
| Configuration Variable | Description | Default |
|---|---|---|
| Sunspot.config.solr.url | The URL at which to connect to Solr | http://127.0.0.1:8983/solr |
| Sunspot.config.pagination.default_per_page | The number of results to return per page if not specified in the search | 30 |
| Sunspot.config.indexing.default_batch_size | The number of records per batch to use when indexing | 50 |
Quickstart with Rails 3 / 4
Add the following commands to existing Gemfile:
gem 'sunspot_rails' gem 'sunspot_solr' # optional pre-packaged Solr distribution for use in development[1]
Bundle it!
bundle install[1]
Generate a default configuration file using the following command:
rails generate sunspot_rails:install[1]
If sunspot_solr was installed, start the packaged Solr distribution with:
bundle exec rake sunspot:solr:start # or sunspot:solr:run to start in foreground[1]
Setting Up Objects
Add a searchable block to the objects you wish to index.
class Post < ActiveRecord::Base
searchable do
text :title, :body
text :comments do
comments.map { |comment| comment.body }
end
boolean :featured
integer :blog_id
integer :author_id
integer :category_ids, :multiple => true
double :average_rating
time :published_at
time :expired_at
string :sort_title do
title.downcase.gsub(/^(an?|the)/, '')
end
end
end[1]
text fields will be full-text searchable. Other fields (e.g., integer and string) can be used to scope queries.
Searching Objects
Post.search do fulltext 'best pizza' with :blog_id, 1 with(:published_at).less_than Time.now field_list :blog_id, :title order_by :published_at, :desc paginate :page => 2, :per_page => 15 facet :category_ids, :author_id end[1]
Search In Depth
Given an object Post setup in earlier steps ...
Full Text
# All posts with a `text` field (:title, :body, or :comments) containing 'pizza'
Post.search { fulltext 'pizza' }
# Posts with pizza, scored higher if pizza appears in the title
Post.search do
fulltext 'pizza' do
boost_fields :title => 2.0
end
end
# Posts with pizza, scored higher if featured
Post.search do
fulltext 'pizza' do
boost(2.0) { with(:featured, true) }
end
end
# Posts with pizza *only* in the title
Post.search do
fulltext 'pizza' do
fields(:title)
end
end
# Posts with pizza in the title (boosted) or in the body (not boosted)
Post.search do
fulltext 'pizza' do
fields(:body, :title => 2.0)
end
end[1]
Development
Running Tests
sunspot
Install the required gem dependencies:
cd /path/to/sunspot/sunspot bundle install[1]
Start a Solr instance on port 8983:
bundle exec sunspot-solr start -p 8983 # or `bundle exec sunspot-solr run -p 8983` to run in foreground[1]
Run the tests:
bundle exec rake spec[1]
If desired, stop the Solr instance:
bundle exec sunspot-solr stop[1]
sunspot_rails
Install the gem dependencies for sunspot:
cd /path/to/sunspot/sunspot bundle install[1]
Start a Solr instance on port 8983:
bundle exec sunspot-solr start -p 8983 # or `bundle exec sunspot-solr run -p 8983` to run in foreground[1]
Navigate to the sunspot_rails directory:
cd ../sunspot_rails[1]
Run the tests:
rake spec # all Rails versions rake spec RAILS=3.1.1 # specific Rails version only[1]
[1] If desired, stop the Solr instance:
cd ../sunspot bundle exec sunspot-solr stop[1]
Generating Documentation
Install the yard and redcarpet gems:
$ gem install yard redcarpet[1]
Uninstall the rdiscount gem, if installed:
$ gem uninstall rdiscount[1]
Generate the documentation from topmost directory:
$ yardoc -o docs */lib/**/*.rb - README.md[1]
References
- Ruby on Rails official website – rubyonrails.org
- http://sunspot.github.com/ – Solr-powered search for Ruby objects
- https://github.com/rsolr/rsolr - A Ruby client for Apache Solr
- The Rails Tutorial – The Ruby on Rails Tutorial book and screencast series teach you how to develop and deploy Ruby on Rails apps
- Rails source code
External links
- Sunspot
- Sunspot: A Solr-Powered Search Engine for Ruby (Linux Magazine)
- How to Implement Spatial Search with Sunspot and Solr (Code Quest)
- heroku + websolr + sunspot (Websolr guides)
This article "Apache Solr and Rails" is from Wikipedia. The list of its authors can be seen in its historical. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.
