1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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:password123@my-awesome-cluster-94865.us-east-1.bonsai.net:443

$ heroku config:add ELASTICSEARCH_URL='http://username123:password123@my-awesome-cluster-94865.us-east-1.bonsaisearch.net:443'

BONSAI_URLはbonsaiのCredentialの画面からも確認可能。
スクリーンショット 2020-12-06 17.02.33.png

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?