読者です 読者をやめる 読者になる 読者になる

ここにタイトルが入ります

デザイン&プログラミングのことも書くし、それ以外のことも書く。

【sunspot】Railsでsunspot(solr)を使用するとき、rsolrでモデルを経由せずインデックス作成を行う。

Rails ruby

お仕事で使う機会があったので忘れないよう記しておきます。


全文検索機能をRubyアプリケーションに設ける場合、便利なのがsunspotですよね。

検索エンジンのsolrを検索に使用し、Railsアプリから簡単に操作することができるようになります。

〜簡単な使い方は下記参照!〜
#278 Search with Sunspot - RailsCasts


sunspotを使えば、Railsアプリの場合モデルに設定を書くだけで、モデルの更新時などにsolrにインデックスを追加することができます。

ただ、パフォーマンスを気にする場合(何万件もバッチで処理するとか)はモデル経由だと結構遅いんですよね…

そういった場合、sunspotがラップしてるrsolrを使うことでもっと早くインデックスの作成を行うことができます。
…それが正しいかどうかは別としてね!


使い方はリンクを見てもらえばわかります。
シンプルです☆

def indexing
  solr = RSolr.connect :url => Sunspot.config.solr.url

  # クエリ直投げでデータを取得
  users = ActiveRecord::Base.connection.execute("select id,name,age from users")

  documents = []
  users.each do |user|
    documents << { id: user[0], name_texts: user[1], age_i: user[2] } 
  end

  solr.add(documents)

  # コミット忘れずにね!
  solr.commit
end


注意するのはこの部分。

{ id: user[0], name_texts: user[1], age_i: user[2] }

どうやらsunspotは要素名に_iとか_textsとか付けることで
属性を設定しているらしいです。


sunspotのスキーマ定義を見ながら要素名をつけていくとうまくいきました←あやふやですみません…


※余談ですがクエリ実行結果の戻り値はDB(アダプタ)によって変わるので
 ↑の例とはちょっと違う書き方になるかもです(ちなみに↑はmysqlの例)。


インデクシングを高速化したい場合は
有効かもです☆