Open20

ElasticSearchの導入

Bonsai ElasticSearchのドキュメントを参考に。

https://docs.bonsai.io/article/97-ruby-on-rails
Gemfile
# 2021/12/11 辞書の検索に利用するBonsaiのセットアップ:参考: https://docs.bonsai.io/article/97-ruby-on-rails
# ※ ドキュメントだと上の二つのbranch名がmasterのままになっていて、mainではなかった。
# 実際にrailsで必須なのは次のGemだけ。
gem 'elasticsearch-model', github: 'elastic/elasticsearch-rails', branch: 'main'
# 任意。rakeタスクやActiveSupport関係の実装に役立つツール。
gem 'elasticsearch-rails', github: 'elastic/elasticsearch-rails', branch: 'main'
# 任意。bonsaiのinitializeをよしなにやってくれるGem。デフォルトだとlocalhost:9200に繋がってしまうところをBONSAI_URLを自動で読み込んでよしなに接続してくれる。
gem 'bonsai-elasticsearch-rails', github: 'omc/bonsai-elasticsearch-rails', branch: 'master'


Wordモデルを検索するための設定。

word.rb
# 参考: https://docs.bonsai.io/article/97-ruby-on-rails
  # モデルを検索できるようにするために必須の設定
  include Elasticsearch::Model
  # ActiveRecordによるレコードの作成・更新・削除に合わせて、ElasticSearch側でも作成・更新・削除を行う。
  include Elasticsearch::Model::Callbacks
  # デフォルトでは、ESは5つのprimary shardsと1つのreplicaを作成する(これによって10のshardsが生成される)が、これはほとんどのアプリにとって過剰。
  # 下の設定は、デフォルトを書き換えて1 primary shardのみを作成するもの(一つのreplicaはデフォルトで作成される)
  settings index: { number_of_shards: 1 }

ローカル開発でもdotenvにherokuのBONSAI_URLを入れとかないといけないっぽい。
BONSAI_URL="xxxxx"

ローカルでelasticsearchをインストール
brew install elasticsearch

すぎさん曰く、elasticsearch-modelelasticsearch-railsを2つ合わせたものと、searchkickは同じものらしい。
elasticsearch-model×elasticsearch-railsのほうが細かいカスタマイズができるらしく、searchkickのほうがラッパーが色々やってくれるらしく、手っ取り早く実装できるらしい。
Searchkickを導入するなら、1つ目と2つ目の作業は不要になる。

今のところ、ElasticSearchとBonsaiとSearchkickの違いについては、

  • ElasticSearchが検索インフラ
  • Bonsaiがインフラ設定(shardsとかreplicaとか)をよしなにしてくれる管理ツール
  • Searchkickやelasticsearch-railsが実際の検索クエリをRailsで書きやすくしてくれるツール
    という認識。

Searchkick × Bonsaiの場合のGemfile

Gemfile
# 2021/12/12 ElasticSearchを使った検索をRailsで簡単にできるようになるツール
# 参考: https://github.com/ankane/searchkick
# 参考: https://medium.com/@nerboda/integrating-elastic-search-with-rails-on-heroku-using-searchkick-and-bonsai-eb1aebbc6df7
gem 'searchkick'
# Elasticsearch::UnsupportedProductError (The client noticed that the server is not a supported distribution of Elasticsearch.):の解決
# 参考: https://stackoverflow.com/questions/68892291/node-and-elasticsearch-client-the-client-noticed-that-the-server-is-not-a-supp
# 参考: https://qiita.com/maztak/items/9da01a8e48fd3f4ac555
gem 'elasticsearch', '7.2.0'
word.rb
class Word < ApplicationRecord
  # ElasticSearchを使った検索 参考: https://medium.com/@nerboda/integrating-elastic-search-with-rails-on-heroku-using-searchkick-and-bonsai-eb1aebbc6df7
  searchkick

  def search_data
    {
        entry: entry,
        meaning: meaning
    }
  end
end
ログインするとコメントできます