Skip to content
This repository


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Simple full text search for Mongoid ORM. Modified to work with multiple stemming libraries.

tag: v0.3.0.beta.2

Fetching latest commit…


Cannot retrieve the latest commit at this time

Octocat-spinner-32 lib
Octocat-spinner-32 spec
Octocat-spinner-32 tasks
Octocat-spinner-32 .document
Octocat-spinner-32 .gitignore
Octocat-spinner-32 Gemfile
Octocat-spinner-32 Gemfile.lock
Octocat-spinner-32 LICENSE
Octocat-spinner-32 Rakefile
Octocat-spinner-32 VERSION
Octocat-spinner-32 mongoid_search.gemspec

Mongoid Search

Mongoid Search is a simple full text search implementation for Mongoid ORM. Modified to work with multiple stemming libraries: fast-stemmer and ruby-stemmer.


In your Gemfile:

gem 'mongoid_search2', :require => 'mongoid_search'
# Optional keyword stemming library:
# gem 'fast-stemmer' # only English
# gem 'ruby-stemmer', :require => 'lingua/stemmer' # English, Russian etc


bundle install


class Product
  include Mongoid::Document
  include Mongoid::Search
  field :brand
  field :name

  references_many :tags
  refereced_in    :category

  search_in :brand, :name, :tags => :name, :category => :name

class Tag
  include Mongoid::Document
  field :name

  referenced_in :product

class Category
  include Mongoid::Document
  field :name

  references_many :products

Now when you save a product, you get a _keywords field automatically:

p = :brand => "Apple", :name => "iPhone"
p.tags << => "Amazing")
p.tags << => "Awesome")
p.tags << => "Superb")
=> true

Now you can run search, which will look in the _keywords field and return all matching results:"apple iphone").size
=> 1

Note that the search is case insensitive, and accept partial searching too:"ipho").size
=> 1

Assuming you have a category with multiple products you can now use the following code to search for 'iphone' in products cheaper than $499

@category.products.where( => 499).csearch('iphone').asc(:price)

In this case we have to use csearch, an alias for search, because since v2.0.0 Mongoid defines it's own method.


match: :any - match any occurrence :all - match all ocurrences Default is :any.

search_in :brand, :name, { :tags => :name }, { :match => :any }"apple motorola").size
=> 1

search_in :brand, :name, { :tags => :name }, { :match => :all }"apple motorola").size
=> 0

allow_empty_search: true - match any occurrence false - match all ocurrences Default is false.

search_in :brand, :name, { :tags => :name }, { :allow_empty_search => true }"").size
=> 1

ignore_list: Pass in an ignore list location. Keywords in that list will be ignored.

search_in :brand, :name, { :tags => :name }, { :ignore_list => Rails.root.join("config", "ignorelist.yml") }

The list should look like:

  a, an, to, from, as

You can include how many keywords you like.

stem_keywords: Whether to stem keywords or not.


  • Strip html with sanitize (
  • Rewrite and test relevant search
  • Move all configurations to a configuration file. Maybe /config/mongoid_search.yml.
Something went wrong with that request. Please try again.