ここでは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の場合とか)