Solr をとりあえず Rails で動かしてみた
Ruby アプリケーションに全文検索機能をさくっと追加できるらしい sunspot を使ってみたのでそのメモ。
Solr を初めて知って、まずは Rails で動けばいいやって人はこの手順通りにやってみればさくっといけるかもしれない。
詳しい動作をもっと知りたいって方はドキュメントやら下記参考URLを覗いてみてください。
環境
手順
事前準備
$ be rais new sun
$ cd sun
- Gemfile
gem 'sunspot_rails' gem 'sunspot_solr'
$ bundle install --path vendor/bundle
sunspot をいじる
- sunspot を使うために設定ファイルを作る
$ be rails g sunspot_rails:install` create config/sunspot.yml
- 起動する
$ be rake sunspot:solr:start
ちなみ停止は
$ be rake sunspot:solr:stop
今回は以下の様な感じで Scaffold する。
$ be rails g scaffold Article title content:text $ be rake db:migrate
- 実際に検索する対象を
searchable
に渡す。app/models/article.rb
を編集。text
で全文検索対象の属性を指定:stored
オプションで Hit 時にその情報を保持できる (ハイライト機能で使える)
class Article < ActiveRecord::Base searchable do text :title text :content, :stored => true end end
$ be rails s
でサーバを立ち上げ、http://localhost:3000/articles
にアクセス後、適当にデータを挿入- 自分は yahoo news から適当に3つほど挿れました
ひとまず検索が機能してるか調べる
$ be rails console
irb(main):001:0> search = Article.search do irb(main):002:1* fulltext 'ドルトムント' irb(main):003:1> end
下のような値が返ってくればとりあえず動いてる。
D, [2014-10-10T01:52:55.472090 #8950] DEBUG -- : SOLR Request (12.3ms) [ path=select parameters={fq: ["type:Article"], q: "ドルトムント", fl: "* score", qf: "title_text content_texts", defType: "edismax", start: 0, rows: 30} ] => <Sunspot::Search:{:fq=>["type:Article"], :q=>"ドルトムント", :fl=>"* score", :qf=>"title_text content_texts", :defType=>"edismax", :start=>0, :rows=>30}>
コンソールからではなくブラウザからも操作してみる
- コントローラを作る
$ be rails g controller article_search index search
検索窓を作る
app/views/article_search/index.html.erb
を編集する。
<%= form_tag '/article_search/search', method: "get" do %> <%= text_field_tag :q %> <%= submit_tag '検索' %> <% end %>
- 検索結果を表示するページを作る
app/views/article_search/search.html.erb
を編集する。each_hit_with_result
メソッドを使う- ちなみにここでハイライト機能を使っている
<p> 検索ワード: <%= params[:q] %> </p> <p> <%= @search.total %> 件ヒット </p> <ul> <% @search.each_hit_with_result do |hit, result| %> <li><div>Article #{<%= hit.primary_key %>}</div> <div><%= result.title %></div> <% hit.highlights(:content).each do |highlight| %> <%= highlight.format { |word| "*#{word}*" } %> <% end %> </li> <% end %> </ul>
- アクションをまだ作っていなかったのでコントローラに以下を追記する
app/controllers/article_search_controller.rb
def search @search = Article.search do fulltext params[:q] do highlight :content end end end
http://localhost:3000/article_search/index
にアクセスして検索ワードをつっこんでみる。
どや!
ハイライトもされてていい感じですね。 簡単ではありましたが、以上です。