« hyperestraierノードサーバーの起動スクリプト | メイン | rails で 画像認証 captcha »

rails でモデルを全文検索

[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でのソート順)に結果が取れるようになります。

トラックバック

このエントリーのトラックバックURL:
http://i-am.web777.net/mt/mt-tb.cgi/29

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)