8
5

More than 5 years have passed since last update.

RailsアプリケーションでElasticsearchのマッピングを更新する方法

Last updated at Posted at 2019-03-21

ここではcurlではなくrubyのgemであるelasticsearch-railsを利用した場合の更新方法をメモ代わりに記載します。

マッピングの追加は単純に以下を行えばできると思います。

__elasticsearch__.create_index!

ただしマッピングを変更する場合、例えば既存のindexに項目を追加する際に上記コマンドを打つと400エラーになることがあります。

解決方法は二つ

解決方法1(おすすめしない)

単純にindexを削除して、作り直せばOKです。

ただ、Elasticsearchを使用している場合、大量にデータをindexingしている場合が多く、時間がかかってしまう場合があり、おすすめできません。
ユーザ影響も出るのでシステム停止も必要になります。

ローカルや開発環境ではこの方法でも良いかもしれません。

解決方法2

マッピングを更新します。

Elasticsearchにはマッピングを更新するクエリがあるので、それを利用します。

__elasticsearch__.client.indices.put_mapping(
  index: index_name,
  type: document_type,
  body: mapping)

index_name, document_typeはそれぞれ使用しているもの、mappingについて少し書きます。
一般的にmappingはmodel内に以下のように記述しているケースが多いと思います。

settings index: { number_of_shards: 5, number_of_replicas: 1 } do
  mappings do
    indexes :test_field1, type: 'keyword'
    indexes :test_field2, type: 'keyword'
  end
end

こいつを渡せば良いですが、私は以下のように渡しています。

__elasticsearch__.client.indices.put_mapping(
  index: index_name,
  type: document_type,
  body: self.mappings.to_hash)

所感

解決方法1も私はローカルではよく使いますが、本番環境で行う際は解決方法2を利用しています。
理由は上記にも書いた通り、データをindexingし直すのが非常に時間がかかるためです。
データが少ない場合は解決方法1でも良いと思います。(またはユーザ影響のないElastcisearchの場合とか)

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5