Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Simple Rails-plugin that provides offline fuzzy-search for ActiveRecord
Ruby
branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
generators/no_fuzz
lib
rails
tasks
test
.gitignore
CHANGELOG
MIT-LICENSE
Manifest
README.markdown
Rakefile
init.rb
install.rb
no_fuzz.gemspec
uninstall.rb

README.markdown

No Fuzz

Simple Rails-plugin that provides offline fuzzy-search for ActiveRecord

Simple as can be fuzzy search. Works with any database supported by Active Record. No dependencies. The notion of being offline means that it creates an index which the search algorithm leverages. Note that this index has to be updated to reflect changes in the database content. The plugin creates a separate database model for the index. This means that no changes will be made to your existing schema.

Note that this family of fuzzy search techniques work best on dictionary-type lookups (names, words, etc).

The plugin is based on code and ideas in Steven Ruttenberg's nice blog entry "Live fuzzy search using n-grams in Rails".

kristian's acts_as_fuzzy_search is a similar plugin, but it targets DataMapper.

Installation and Setup

No Fuzz as a plugin:

cd your_rails_project
script/plugin install git://github.com/Chrononaut/no_fuzz.git
# Now we create a trigram migration for the model we want to add fuzzy search to:
script/generate no_fuzz Model
rake db:migrate

Or if you want to use is as a gem:

gem sources -a http://gems.github.com
sudo gem install Chrononaut-no_fuzz 

Then add the following line to your environment.rb file

config.gem "Chrononaut-no_fuzz", :source => "http://gems.github.com", :lib => "no_fuzz"

Basic Usage

Add the following code in the model you'd like to index:

include NoFuzz
fuzzy :field

Where field is the field used for the indexing data (you can use multiple fields if you want).

Populate the index by running:

Model.populate_trigram_index

Then, you can search fuzzily with the fuzzy_find method:

Model.fuzzy_find("query")
Model.fuzzy_find("query", 10) # find maximum 10 rows

A concrete example from a real app can look like this:

>> Contractor.fuzzy_find('johm')
=> [#<Contractor id: 1, full_name: "John Doe", created_at: "2009-04-30 10:05:02", updated_at: "2009-04-30 10:05:02">]

Contributors

The following people have submitted changes which have been applied to the core:

Copyright (c) 2009 Bjørn Arild Mæland, released under the MIT license

Something went wrong with that request. Please try again.