Mongoid Searchable
Mongoid Searchable provides simple field search for your Mongoid models using the full-text search technique described in the MongoDB documentation.
0.1.x Compatibility
Please note that version 0.2.0 has renamed the search method to text_search to avoid naming issues. Sorry for the inconvenience but given the issues this can cause and limited alternative solutions, I figured that it would be prudent to make this change sooner rather than later.
Getting Started
First, add mongoid-searchable to your Gemfile:
gem 'mongoid-searchable'
Next, include the module and tell it how to search your model:
class City
include Mongoid::Document
include Mongoid::Searchable
field :name, :type => String
field :population, :type => Integer
field :boroughs, :type => Array
field :officials, :type => Hash
searchable :name, :population, :boroughs, :officials
end
You can now use the search method on your model to find what you're looking for:
# Create a few example cities
City.create :name => 'New York, NY', :population => 18_897_109,
:boroughs => ['Manhattan', 'Brooklyn', 'Queens', 'The Bronx', 'Staten Island'],
:officials => { 'Mayor' => 'Michael Bloomberg', 'Governor' => 'Andrew Cuomo' }
City.create :name => 'Rochester, NY', :population => 1_098_201,
:officials => { 'Mayor' => 'Thomas Richards', 'Governor' => 'Andrew Cuomo' }
City.create :name => 'Rochester, MN', :population => 186_011,
:officials => { 'Mayor' => 'Ardell Brede', 'Governor' => 'Mark Dayton' }
City.text_search('ny') # => 2 records
City.text_search('rochester') # => 2 records
City.text_search('manhattan') # => 1 record
You can also choose to match all or any tokens. The default is to match all terms:
City.text_search('rochester ny') # => 1 record (defaults to all)
City.text_search('rochester ny', :match => :any) # => 3 records
We can match partial or exact words as well. The default is to match partial words:
City.text_search('roch') # => 2 records
City.text_search('roch', :exact => true) # => 0 records
You can chain other criteria on to your search, as per Mongoid convention:
City.text_search('ny').where(:population.gt => 2_000_000) # => 1 record
City.text_search('rochester').where(:population.lt => 500_000) # => 1 record
Customization
You can also pass additional arguments to searchable to provide more control over the behavior.
Changing the field name: You can specify the field to use for keyword storage using as. The default is to use the keywords field:
class Person
...
searchable :name, :as => :search_fields
...
end
Turning off indexing: You can also turn off indexing on your keyword field using index. This isn't recommended and defaults to on:
class Person
...
searchable :name, :index => false
...
end
Enhancements and Pull Requests
If you find the project useful but it doesn't meet all of your needs, feel free to fork it and send a pull request.
License
MIT license, go wild.