アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Sunspotを使いRailsでSolrの環境構築を行う方法

はじめに

あけましておめでとうございます。
s4naです。
今回は、最近勉強し始めたSolrについて書いていきます。

SunspotとはSolrという検索エンジンをRuby上で使うためのライブラリです。

github.com

中でも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)

公式のドキュメント

github.com

github.com

github.com

参考にさせていただいた記事

blog.piyo.tech

qiita.com

www.iterontech.com