gotagota日記

「面白きことは良きことなり」

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 にアクセスして検索ワードをつっこんでみる。

どや!

f:id:gotagotagoat:20141010031905p:plain

ハイライトもされてていい感じですね。 簡単ではありましたが、以上です。

参考URL