はじめに
あけましておめでとうございます。
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)