fuzzily and blurrily - two fast fuzzy-text search/match gems
Users make spelling mistakes… espacially when typing the name of an exotic destination.
Show me properties of **Marakech** !
> Here are some properties in **Marrakesh**, Morroco.
> Did you mean **Martanesh**, Albania, **Marakkanam**, India, or **Marasheshty**, Romania?
fuzzily and blurrily both find misspelled, prefix, or partial needles in a haystack of strings, quickly.
With a database of 10 million entries, blurrily
can find fuzzy matches for
any input string within 75ms on typical hardware. On less pathological
datasets, you can easily expect searches to take no more than a few
milliseconds, typically faster than caching!
Both gems are tested with various Ruby VMs and versions of Rails, and here at
HouseTrip we’re actually using blurrily
in production.
Fuzzily
Fuzzily is Blurrily’s older brother. It is easier to integrate into an typical Rails application and lets you make any model’s attributes searchable:
class MyStuff < ActiveRecord::Base
# assuming my_stuffs has a 'name' attribute
fuzzily_searchable :name
end
MyStuff.find_by_fuzzy_name('Some Name', :limit => 10)
#=> records
Installing and using it can be done in minutes with a typical Rails application.
Blurrily
Fuzzily’s younger sibling is slightly harder to integrate, but it’s crazy fast (backed by a C extension) and scales very well. You can use it as a client/server like so:
$ blurrily &
$ irb -rubygems -rblurrily/client
> client = Blurrily::Client.new
> client.put('London', 1337)
> client.find('lonndon')
#=> [1337]
Or directly:
$ irb -rubygems -rblurrily/map
> map =
> client.put('London', 1337)
> client.find('lonndon')
#=> [1337]
If you have a similar problem and feel ElasticSearch or anything Lucene backed is overkill, why not give them a go!