Elasticsearch Railsのimport時のオプション
Elasticsearch Rails gem で、DBからデータを投入する際のオプションについて調べました。
前提
- elasticsearch-model 7.2.1
- elasticsearch-rails 7.2.1
例として以下のようなArticleモデルのデータをElasticsearchに投入することを考えます。
class Article < ApplicationRecord
include Elasticsearch::Model
end
各オプションについて
オプション無し
オプション無しの場合、全てのデータが1000件ごとに取得され、投入されます。
事前にインデックスを作成していなければ失敗します。
Article.import
※ Article.__elasticsearch__.import
でも同じです。
batch_size
batch_sizeオプションで、データ取得、投入時のバッチサイズを指定することができます。
Article.import batch_size: 100
scope
scopeオプションで、モデルのscopeを指定し、限定されたデータのみを投入することができます。
Article.import scope: 'published'
query
queryオプションで、特定のクエリを適用したデータのみを投入することができます。
Article.import query: -> { where(author_id: author_id) }
force
force: true
で、インデックスを削除・作成してからデータ投入することができます。(デフォルトはfalse)
Article.import force: true
# 上記は以下と同じ
Article.__elasticsearch__.create_index!
Article.import
refresh
refresh: true
で、全てのバッチ終了後に、refreshを行います。
Article.import refresh: true
refreshについては以下が参考になりました。
テスト時など、すぐに検索可能な状態にする必要がある時に役立ちそうです。
ケース別のimportオプション
初回
seedデータ投入後など、初回にElasticsearchにデータを投入する際は、 force: true
でindexの作成と一緒に行うのが良さそうです。
Article.import force: true
データ更新・マッピング変更後
データを一括で更新した後や、カラム追加等でマッピングを変更した後に、本番のElasticsearchのデータを更新したい場合は、forceオプションを付けず、importのみ行うのが良さそうです。
Article.import
これにより、一時的にデータが消えることなく、順次中身を更新することができます。
データ一括削除後
データを一括で削除した後などは、 force: true
をつけてindexを再作成する必要がありそうです。そうしなければ、古いデータが残ったままになってしまいます。
Article.import force: true
テスト時
テストで一括で投入する際などは、 refresh: true
もつけて、すぐに検索可能にすると良さそうです。(動作未検証)
Article.import force: true, refresh: true
参考
Discussion