sunpotはsolrというJava製の全文検索サーバをrubyから使えるGem
sunspot_rails はsunspotにマージされてました
参考
railscasts.com/episodes/278-search-with-sunspot?language=ja&view=asciicast
公式
環境
Ruby 2.0.0
Rails4.0.2
目次
Gemfile
1 2 | gem 'sunspot_rails' gem 'sunspot_solr' # optional pre-packaged Solr distribution for use in development |
sunspot:reindexに必要なgemを追加
1 | gem 'progress_bar', group: :development |
bundle
generate
1 | rails g sunspot_rails:install |
solrサーバへの接続設定をするconfig/sunspot.yamlが生成される
solrサーバの起動・停止
solrサーバは./solr以下に配置される
1 | rake sunspot:solr:start |
solrサーバを背後で起動
1 | rake sunspot:solr:run |
solrサーバを前面で起動 ctrl+cで停止
1 | rake sunspot:solr:stop |
背後のsolrサーバを停止
Model
Modelにsearchable句を追加
1 2 3 4 5 6 | class Article < ActiveRecord::Base searchable do text :title, stored: true text :content, stored: true end end |
text はsolrのfield型
storedオプションは対象を保存する.結果を強調表示するのに必要.
以前のデータ用のインデックスを作成
1 | rake sunspot:reindex |
Controller
searchメソッドが使えるので、その中でfulltextで検索ができる
1 2 3 4 5 6 7 8 | # GET /articles.json def index @search = Article.search do fulltext params[:search] end @articles = @search.results end |
View
:searchワードを投げるformをつくる
1 2 3 4 | <%= form_tag articles_path, method: :get do %> <%= text_field_tag :search, params[:search] %> <%= submit_tag "Search" %> <% end %> |
できた
kaminariのHelperをつかう
Gemfile
1 | gem 'kaminari' |
Controller
1 2 3 4 5 6 7 | def index @search = Article.search do fulltext params[:search] paginate page: params[:page], per_page: 5 end @articles = @search.results end |
View
1 | <%= paginate @search.hits %> |
ダミーデータ
db/seeds.rb
ダミーデータはemmetのloremとかすぐ使えるダミーテキストとかから
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 10.times do Article.create( title: "lorem ipsum", content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." ) end 10.times do Article.create( title: "セロ弾きのゴーシュ", content: "からだはかっこうのマッチ晩者の子をいえゴーシュましな。 それからしばらく生意気ましたというむしうます。愉快だないものましはたまた赤の変げのままからはねからばかたございから、君まで兎をするれんますだ。 わかっ過ぎあなたは額へ何気ないうて半分の床の交響曲らと習え第十ばかみちのおじぎをふるえが来ました。町はずれはいっぺんくって来た。 セロも一倒れるぶんのようでまえているた。ホールはねどこゴーシュたり何が云いてくれまし。間も手をあんまりにするて猫に外のように考えが勢が出してもう包みを過ぎてくださいた。ぶるぶるどうも音を眼を飛んたた。おれとてもに蚊と行くてゴーシュへ怒っうだ。" ) end |
1 | rake db:seed |
できた
日本語用のSchemaなど
solr/conf/schema.xmlにある.一応デフォルトでも日本語の単語が使えるぽい.
qiita.com/ma2kubo/items/c38ae4f70d3613a34941
d.hatena.ne.jp/kahnn/20130828/1377645204
ngram + wildcard
github.com/sunspot/sunspot/wiki/Wildcard-searching-with-ngrams
古いけどこれしかない
と思ったら新訂版出てた!2013/11/29発売