Rails×Heroku×bonsai×Searchkick(Elasticsearch)利用時の覚書き


モデルProductを対象にSearchkick(Elasticsearch)で検索する場合。

Gemfile.rb
gem 'elasticsearch', '7.2.0'
gem 'searchkick'
product.rb
class Product < ApplicationRecord
    searchkick language: "japanese"

    def search_data
        {
            keywords: keywords
        }
    end
end
home_controller.rb
class HomeController < ApplicationController
  def top
  end

  def search    
    @products = self.products_query
  end

  private
    def products_query
      if params[:q].present?
        Product.search params[:q], fields: [:keywords], body_options: {min_score: 1}, operator: "or"
      else
        Product.all.order(id: "desc")
      end
    end
end

Elasticsearchの導入

ここは前回の開発で入れていた。
https://qiita.com/maztak/items/0f722ad01c982a96de59

brew install elasticsearchだけでは上手くいかず、Elasticsearch公式サイトの手順を見ながら入れた気がする。
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/brew.html

$ which elasticsearch
-> usr/local/bin/elasticsearch #私の場合はこのディレクトリに入っていました

ローカルで開発するとき

Elasticsearchが既に入っていれば、起動してインデックス生成してあげれば検索結果に出てくる

# Elasticsearchを起動
$ elasticsearch

# 新規タブでkibanaを起動(任意)
$ kibana

# 新規タブでローカルサーバーを起動
$ rails s

# Rails Console でインデックスを生成
$ rails c
irb(main):001:0> Product.reindex # 検索対象となるモデル名がProductの場合

Production Heroku

HerokuにBonsaiアドオンを追加

GUIからポチポチするだけで、追加と環境変数BONSAI_URLの設定が自動的にされる。ただし環境変数ELASTICSEARCH_URLは手動で同じ値を設定する必要がある。

$ heroku config:get BONSAI_URL -a myapp
-> http://username123:[email protected]:443

$ heroku config:add ELASTICSEARCH_URL='http://username123:[email protected]:443'

BONSAI_URLはbonsaiのCredentialの画面からも確認可能。

bonsai公式ドキュメントでは、URL例がxxx.bonsai.io/のドメインだが、私のはxxx.bonsaisearch.net:443となってた。末尾の数字までちゃんと設定するように。

インデックス作成

$ heroku run rails searchkick:reindex CLASS=Product -a myapp # 対象モデルがProductの場合
# もしくは
$ heroku run rails searchkick:reindex:all -a myapp

rakeの方でやるとElasticsearchのバージョンによっては上手く行かないことがあるかも(Searchkick::ImportErrorがでた)。

参考

Searchkick
https://github.com/ankane/searchkick

Heroku Bonsai Elasticsearch Document
https://devcenter.heroku.com/articles/bonsai

SearchkickのREADMEの日本語訳
https://qiita.com/kentosasa/items/f0af67f62f4692d68370#deployment