はじめに
あけましておめでとうございます。
s4naです。
今回は、最近勉強し始めたSolrについて書いていきます。
SunspotとはSolrという検索エンジンをRuby上で使うためのライブラリです。
中でもSunspot::Rails を使うとSolrをインストールせずともSolrの開発環境が構築できます。
動作環境
本記事内容は以下のの環境で動作確認できています。
- macOS Catalina
- Homebrew: 2.7.5
- Ruby: 2.7.1
- Bundler: 2.1.4
- Ruby on Rails: 6.1.1
作業内容
Javaのインストール
SolrはJavaで動いているためJavaをインストールする必要があります。 Solr/Java Requirements によるとSolrが対応しているバージョンがJava1.8なので、1.8をインストールします。
Java1.8というのは、Java 8とも呼ばれます。
同じバージョンを指す名前が2種類?あることついては歴史的経緯があるみたいです。
詳しくは 👉 Java SE versions history
ということで、AdoptOpenJDKの8をインストールします。
OpenJDKではなく、AdoptOpenJDKなことに注意してください。
※なぜOpenJDKでインストールできないのかについては以下の記事をご確認ください。
MacのBrewで複数バージョンのJavaを利用する + jEnv Java 8のインストール
brew install --cask adoptopenjdk8
pathを通す
.zshrc に追加(bashを使っているのであれば、 .bashrc )
export JAVA_HOME=`/usr/libexec/java_home -v "1.8"` PATH=${JAVA_HOME}/bin:${PATH}
RailsにGemを入れる
gem 'sunspot_rails' group :development, :test do gem 'sunspot_solr' end
sunspot_rails: RailsとSunspotの連携を良い感じでしてくれるGem。sunspot_solr: これを入れると開発環境でSolr自体をインストールしないで済むGem。 ※公式Documentにもありますが、本番環境では使用できません。
Sunspot::RailsをRailsにインストール
bundle exec rails generate sunspot_rails:install
ModelにSeachableを追加する
SolrにindexしたいModelに searchable do ~ end を追加しましょう。
それだけだとわからないので、以下に例を書いておきます。
https://github.com/sunspot/sunspot#setting-up-objects
例:Post Modelにbodyというカラムがあった時
まずは動かすことが目的なので、とりあえず1カラムindexを追加してみましょう。
class Post < ApplicationRecord
searchable do
text :body
end
Solrの起動を確認
bundle exec rake sunspot:solr:start
http://localhost:8982/solr/#/ でアクセスすることができれば、Solrがローカルで起動しています。
Rails Consoleで Reindex
Rails ConsoleでReindexしてみます。
Solrにデータが読み込まれるはずです。
※ $bundle exec rails c でRails Consoleは起動されます。
Post.reindex
Rails ConsoleでSolrの情報を検索
Solrに読み込まれた情報を検索してみます。
pp Post.search { fulltext 'hoge' }
おまけ: 起動しなかった場合
bundle exec rake sunspot:solr:run コマンドで起動時のエラーが確認できるらしいです。
作業していて大変助けられました🙏
Error Tips
私が遭遇したエラー内容と対処方法を記述しています。(検索してひっかかる人もいらっしゃるかもしれないので)
Unrecognized VM option xxx
Unrecognized VM option 'UseConcMarkSweepGC' Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
誤ったJavaのバージョンをインストールしている可能性があります。
※古いCGのオプションを指定しているというエラーなので、Gem内部に記述されているJavaVMの起動オプションをいじったら起動しますが(私は一度やってみて起動することを確認しましたが)、サポートしていないバージョンなので、他にもエラーが出てきたりしてやっかいなので、サポートされてるJavaのバージョンをインストールすることをおすすめします。
RSolr::Error::ConnectionRefused
なんらかの原因でSolrが起動していません。
こちらも上記と同様で、誤ったJavaのバージョンをインストールしている可能性があります。
rake aborted!
RSolr::Error::ConnectionRefused: Connection refused - {:data=>"{\"delete\":{\"query\":\"type:User\"}}", :headers=>{"Content-Type"=>"application/json"}, :method=>:post, :params=>{:wt=>:json}, :query=>"wt=json", :path=>"update", :uri=>#<URI::HTTP http://localhost:8982/solr/development/update?wt=json>}
(eval):2:in `post'
/Users/user_name/.rbenv/versions/2.7.1/bin/bundle:23:in `load'
/Users/user_name/.rbenv/versions/2.7.1/bin/bundle:23:in `<main>'
Caused by:
Faraday::ConnectionFailed: Failed to open TCP connection to localhost:8982 (Connection refused - connect(2) for "localhost" port 8982)
(eval):2:in `post'
/Users/user_name/.rbenv/versions/2.7.1/bin/bundle:23:in `load'
/Users/user_name/.rbenv/versions/2.7.1/bin/bundle:23:in `<main>'
Caused by:
Errno::ECONNREFUSED: Failed to open TCP connection to localhost:8982 (Connection refused - connect(2) for "localhost" port 8982)
(eval):2:in `post'
/Users/user_name/.rbenv/versions/2.7.1/bin/bundle:23:in `load'
/Users/user_name/.rbenv/versions/2.7.1/bin/bundle:23:in `<main>'
Caused by:
Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 8982
(eval):2:in `post'
/Users/user_name/.rbenv/versions/2.7.1/bin/bundle:23:in `load'
/Users/user_name/.rbenv/versions/2.7.1/bin/bundle:23:in `<main>'
Tasks: TOP => sunspot:solr:reindex => sunspot:reindex
(See full trace by running task with --trace)