class ElasticArSync::Elastic::Services::IndexHandler

Public Class Methods

new(klass) click to toggle source
# File lib/elastic_ar_sync/elastic/services/index_handler.rb, line 2
def initialize(klass)
  @klass = klass
end

Public Instance Methods

create_index(new_index_name) click to toggle source

インデックスを作成 デフォルトは クラス名の小文字_環境名

# File lib/elastic_ar_sync/elastic/services/index_handler.rb, line 7
def create_index(new_index_name)
  @klass.__elasticsearch__.client.indices.create index: new_index_name, body: { settings: @klass.settings.to_hash, mappings: @klass.mapping.to_hash }
end
delete_index(target_index) click to toggle source
# File lib/elastic_ar_sync/elastic/services/index_handler.rb, line 11
def delete_index(target_index)
  raise 'can not delete because this index is using now' if target_index == target_alias

  @klass.__elasticsearch__.client.indices.delete index: target_index rescue false
end
import_all_record(target_index ,batch_size = 100) click to toggle source

DBの内容をESのインデックスに同期する レコード量が多いと時間がかかるのでこれだけは非同期実行

# File lib/elastic_ar_sync/elastic/services/index_handler.rb, line 19
def import_all_record(target_index ,batch_size = 100)
  @klass.__elasticsearch__.import(index: target_index, batch_size: batch_size)
end
switch_alias(alias_name:, new_index_name:) click to toggle source

ダウンタイムなしでインデックスを切り替える techlife.cookpad.com/entry/2015/09/25/170000

# File lib/elastic_ar_sync/elastic/services/index_handler.rb, line 25
def switch_alias(alias_name:, new_index_name:)
  raise 'this is already assigned' if new_index_name == target_alias

  actions = [{ add: { index: new_index_name, alias: alias_name } }]
  old_indexes = @klass.get_aliases.keys
  old_indexes.each { |old_index| actions << { remove: { index: old_index, alias: alias_name } } }

  @klass.__elasticsearch__.client.indices.update_aliases(body: { actions: actions })
end

Private Instance Methods

target_alias() click to toggle source
# File lib/elastic_ar_sync/elastic/services/index_handler.rb, line 37
def target_alias
  @klass.get_aliases.keys.select { |index| @klass.get_aliases[index]["aliases"].present? }.first
end