Hyperestraierでsearch_doを使おうかと思ったらrails3系に対応していなそうだったので,sunspotを使ってみた
sunspotは
SunspotはRubyアプリケーションに全文検索機能を追加するためのソリューションです。バックグラウンドでSolrを利用し、多くの優れた機能を提供します。今回のエピソードでは、過去のエピソードで使用したブログアプリケーションを例にして、Sunspotを使ってRailsアプリケーションに全文検索機能を追加します。
ASCIIcasts - “Episode 278 - Sunspotで全文検索”
とのことです。
上記サイト参考にインストール手順をメモ。
インストール手順をメモ。
Railsのスケルトン作成して適当に動作するところまで作成。スケルトンの手順は割愛
rails new App rails g scaffold product name:string description:text #商品モデル, 名前(string)、説明文(text) DBのmigrateしたり....あれこれやる
gemでライブラリをインストール
Gemfileに追加
# App/Gemfile gem 'sunspot_rails'
bundle update
設定ファイルを生成
rails g sunspot_rails:install
モデルに全文検索のカラム指定。他のtext以外のカラム指定はintegerとか指定する。リファレンス(
File: README
— Documentation by YARD 0.7.3
)参照
# App/app/models/product.rb class Product < ActiveRecord::Base searchable do # 検索対象のカラムを指定 text :name, :decription end end
solrを起動する
rake sunspot:solr:start # RAILS_ENV=productin で環境をproductionに変更
インデックスを作成する
rake sunspot:reindex # RAILS_ENV=productin で環境をproductionに変更
コントローラから呼び出してみる
Product.searchメソッドを呼ぶ。ブロック内には検索条件を色々かける様子。
# App/app/controllers/products_controller.rb class ProductsController < ApplicationController def search # searchメソッドで検索する ブロック内には色々条件を追加できるみたい。 @search = Product.seach do keywords params[:keyword] end @products = @search.results end end
感じで簡単だった。個人的にはお気に入りになった。sunspotの組み込みsolrは詳細なチューニングできないっぽいんで、大規模アプリのproduction環境では別途solrをインストールしてチューニングした方がいいらしい。
sunspot:solr:startの起動エラーは表示されない
solrを起動してるはずなのにインデックスするときに接続できない現象があって
# rake sunspot:solr:start # rake sunspot:reindex rake aborted! Connection refused - connect(2) /usr/lib/ruby/1.9.1/net/http.rb:644:in `initialize' /usr/lib/ruby/1.9.1/net/http.rb:644:in `open' /usr/lib/ruby/1.9.1/net/http.rb:644:in `block in connect' /usr/lib/ruby/1.9.1/timeout.rb:44:in `timeout' /usr/lib/ruby/1.9.1/timeout.rb:87:in `timeout' /usr/lib/ruby/1.9.1/net/http.rb:644:in `connect' /usr/lib/ruby/1.9.1/net/http.rb:637:in `do_start' /usr/lib/ruby/1.9.1/net/http.rb:626:in `start' /usr/lib/ruby/1.9.1/net/http.rb:1160:in `request' /usr/lib/ruby/1.9.1/net/http.rb:970:in `post' /usr/lib/ruby/gems/1.9.1/gems/rsolr-0.12.1/lib/rsolr/connection/net_http.rb:22:in `post' /usr/lib/ruby/gems/1.9.1/gems/rsolr-0.12.1/lib/rsolr/connection/requestable.rb:33:in `request' /usr/lib/ruby/gems/1.9.1/gems/rsolr-0.12.1/lib/rsolr/client.rb:34:in `request' /usr/lib/ruby/gems/1.9.1/gems/rsolr-0.12.1/lib/rsolr/client.rb:22:in `update' /usr/lib/ruby/gems/1.9.1/gems/rsolr-0.12.1/lib/rsolr/client.rb:76:in `delete_by_query' /usr/lib/ruby/gems/1.9.1/gems/sunspot-1.2.1/lib/sunspot/indexer.rb:55:in `remove_all' /usr/lib/ruby/gems/1.9.1/gems/sunspot-1.2.1/lib/sunspot/session.rb:181:in `block in remove_all' /usr/lib/ruby/gems/1.9.1/gems/sunspot-1.2.1/lib/sunspot/session.rb:181:in `each' /usr/lib/ruby/gems/1.9.1/gems/sunspot-1.2.1/lib/sunspot/session.rb:181:in `remove_all' /usr/lib/ruby/gems/1.9.1/gems/sunspot-1.2.1/lib/sunspot/session_proxy/abstract_session_proxy.rb:11:in `remove_all' /usr/lib/ruby/gems/1.9.1/gems/sunspot-1.2.1/lib/sunspot.rb:454:in `remove_all' /usr/lib/ruby/gems/1.9.1/gems/sunspot_rails-1.2.1/lib/sunspot/rails/searchable.rb:164:in `solr_remove_all_from_index' /usr/lib/ruby/gems/1.9.1/gems/sunspot_rails-1.2.1/lib/sunspot/rails/searchable.rb:183:in `solr_reindex' /usr/lib/ruby/gems/1.9.1/gems/sunspot_rails-1.2.1/lib/sunspot/rails/tasks.rb:57:in `block (3 levels) in <top (required)>' /usr/lib/ruby/gems/1.9.1/gems/sunspot_rails-1.2.1/lib/sunspot/rails/tasks.rb:56:in `each' /usr/lib/ruby/gems/1.9.1/gems/sunspot_rails-1.2.1/lib/sunspot/rails/tasks.rb:56:in `block (2 levels) in <top (required)>' /usr/lib/ruby/1.9.1/rake.rb:634:in `call' /usr/lib/ruby/1.9.1/rake.rb:634:in `block in execute' /usr/lib/ruby/1.9.1/rake.rb:629:in `each' /usr/lib/ruby/1.9.1/rake.rb:629:in `execute' /usr/lib/ruby/1.9.1/rake.rb:595:in `block in invoke_with_call_chain' /usr/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' /usr/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' /usr/lib/ruby/1.9.1/rake.rb:581:in `invoke' /usr/lib/ruby/1.9.1/rake.rb:2041:in `invoke_task' /usr/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level' /usr/lib/ruby/1.9.1/rake.rb:2019:in `each' /usr/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level' /usr/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling' /usr/lib/ruby/1.9.1/rake.rb:2013:in `top_level' /usr/lib/ruby/1.9.1/rake.rb:1992:in `run' /usr/bin/rake:31:in `<main>'
で色々調べたらAPI Only - Stack Exchangeにヒントがあってrake sunspot:solr:runで対話しきに起動できる
#rake sunspot:solr:run rake aborted! No such file or directory - java -Djetty.port=8982 -Dsolr.data.dir=/var/rails/App/solr/data/development -Dsolr.solr.home=/var/rails/App/solr -Djava.util.logging.config.file=/tmp/logging.properties20111028-44946-fm458o -jar start.jar /usr/lib/ruby/gems/1.9.1/gems/sunspot-1.2.1/lib/sunspot/server.rb:74:in `exec' /usr/lib/ruby/gems/1.9.1/gems/sunspot-1.2.1/lib/sunspot/server.rb:74:in `block in run' /usr/lib/ruby/1.9.1/fileutils.rb:121:in `chdir' /usr/lib/ruby/1.9.1/fileutils.rb:121:in `cd' /usr/lib/ruby/gems/1.9.1/gems/sunspot-1.2.1/lib/sunspot/server.rb:73:in `run' /usr/lib/ruby/gems/1.9.1/gems/sunspot_rails-1.2.1/lib/sunspot/rails/server.rb:15:in `run' /usr/lib/ruby/gems/1.9.1/gems/sunspot_rails-1.2.1/lib/sunspot/rails/tasks.rb:13:in `block (3 levels) in <top (required)>' /usr/lib/ruby/1.9.1/rake.rb:634:in `call' /usr/lib/ruby/1.9.1/rake.rb:634:in `block in execute' /usr/lib/ruby/1.9.1/rake.rb:629:in `each' /usr/lib/ruby/1.9.1/rake.rb:629:in `execute' /usr/lib/ruby/1.9.1/rake.rb:595:in `block in invoke_with_call_chain' /usr/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' /usr/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' /usr/lib/ruby/1.9.1/rake.rb:581:in `invoke' /usr/lib/ruby/1.9.1/rake.rb:2041:in `invoke_task' /usr/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level' /usr/lib/ruby/1.9.1/rake.rb:2019:in `each' /usr/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level' /usr/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling' /usr/lib/ruby/1.9.1/rake.rb:2013:in `top_level' /usr/lib/ruby/1.9.1/rake.rb:1992:in `run' /usr/bin/rake:31:in `<main>'
javaのランタイムがなかったのでaptでjreをインストールしておkだった