[HyperEstraier]
[全文検索]
[rails_plugin]
[rails]
[ruby]
acts_as_searchableプラグイン。
hyperestraierでモデルを全文検索できるようになります。
./script/plugin install svn://poocs.net/plugins/trunk/acts_as_searchable
例
class User < ActiveRecord::Base
acts_as_searchable :searchable_fields=>[:name, :introduce]
end
としておけば、name introduce カラムが検索の対象になります。
User.reindex!
User.estraier_connection.status #=> 200
これでHyperEstraierインデックスが変更されます。
失敗してもエラーをはかないらしいので一応 status を確認しておく必要あり。
また、save, destroy等、モデルの変更があった際には、自動的にインデックスが変更されます。
検索方法はこんなかんじ。
User.fulltext_search('検索ワード')
参考サイト
さて一つ問題が発生。
HyperEstraierは、スコア順に id のリストを返すんですが、acts_as_searchable プラグインは、さらにそこからSQLを叩いて、モデルにマッピングという仕様になっているため、fulltext_searchの結果は、id 順にソートされてしまいます。
そこで、少し中身を変更。
acts_as_searchable.rb の、fulltext_search メソッドの最終行
matches.blank? ? [] : find(matches.collect { |m| m.attr('db_id') }, find_options)
と、なっているところを、以下のように変更。
if matches.blank?
return []
else
models = find(matches.collect { |m| m.attr('db_id') }, find_options)
models_hash = {}
models.each{| model | models_hash[model.id] = model}
return matches.collect { |m| models_hash[m.attr('db_id').to_i] }
end
これで、スコア順(HyperEstraierでのソート順)に結果が取れるようになります。