Ximate
ApproXIMATE fuzzy search for Ruby on Rails activerecord models.
Requirements
-
Rails >= 3.0.1
Installation
gem install ximate
Usage
In your model puts some like this:
class Post < ActiveRecord::Base
define_index do
add_text title, 3
add_text keywords.join(' '), 2
add_text body(:en)
end
end
In this case we can perform an appoximate search on title, keywords and body fields of posts where title is most important than keywords than body (title have priority 3, keywords 2 and body 1).
You can also define indexes for different locales like this:
class Post < ActiveRecord::Base
[:en, :it, :de].each do |locale|
define_index(locale) do
add_text title(locale)
add_text body(locale)
end
end
end
Then you can perform a search
Post.asearch('Hello world').where(:public => true).limit(5)
asearch
method is chainable with the usual activerecord methods.
The cool stuff is that if you search with
Post.asearch('Hello worlds').where(:public => true)
the results will be the same! The error allowed by Ximate can be expressed as a percentage by setting the option Ximate::OPTIONS[:match_error_percent]
. Default value is 20%.
Finally you can set some Ximate options in your initializers.
Ximate::OPTIONS[:match_error_percent] = 20
Ximate::OPTIONS[:ignore_word_short_than] = 2
Ximate::OPTIONS[:async] = false
Ximate::OPTIONS[:logger] = true
Ximate::OPTIONS[:debug] = false
Ordering
You can order the results by rank (calculate by Ximate)
Post.asearch('Hello world').order('rank DESC').where(:public => true)
Unfortunately to do this, Ximate use the FIELD
function supported only by MySQL. So the ordering by rank works only with MySQL.
Questions or problems?
If you have any issues please add an issue on GitHub or fork the project and send a pull request.
Copyright
Copyright © 2010 Enrico Pilotto. MIT license.