🐕

Elasticsearch Railsのimport時のオプション

2023/01/24に公開

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については以下が参考になりました。

https://zenn.dev/kyo18/articles/b8409bff18d277

テスト時など、すぐに検索可能な状態にする必要がある時に役立ちそうです。

ケース別の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

参考

https://rubydoc.info/gems/elasticsearch-model/Elasticsearch/Model/Importing/ClassMethods

Discussion