class Elasticsearch::Extensions::Documents::AliasedIndexStore

Attributes

client[R]
read_alias[R]
storage[R]
write_alias[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 8
def initialize(options = {})
  @client      = options.fetch(:client)  { Documents.client }
  @storage     = options.fetch(:storage) { Storage.new }
  @write_alias = Documents.index_name + "_write"
  @read_alias  = Documents.index_name + "_read"
end

Public Instance Methods

bulk_index(documents) click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 87
def bulk_index(documents)
  client.bulk body: bulk_index_operations(documents)
end
delete(payload) click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 19
def delete(payload)
  client.delete payload.merge(index: write_alias)
end
index(payload) click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 15
def index(payload)
  client.index payload.merge(index: write_alias)
end
indices_for_alias(alias_name) click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 45
def indices_for_alias(alias_name)
  client.indices.get_alias(name: alias_name).keys
end
refresh() click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 27
def refresh
  client.indices.refresh index: read_alias
end
reindex(options = {}, &block) click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 31
def reindex(options = {}, &block)
  timestamp      = Time.now.strftime('%Y%m%d-%H%M%S')
  new_index_name = Documents.index_name + "_#{timestamp}"
  current_index_name = indices_for_alias(write_alias).first

  storage.create_index new_index_name
  swap_index_alias(alias: write_alias, old: current_index_name, new: new_index_name)

  block.call(self) if block_given?

  swap_index_alias(alias: read_alias, old: current_index_name, new: new_index_name)
  storage.drop_index current_index_name
end
reset_aliases() click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 73
def reset_aliases
  if client.indices.exists_alias(name: write_alias)
    indices_for_alias(write_alias).each do |index|
      client.indices.delete_alias index: index, name: write_alias
    end
  end

  if client.indices.exists_alias(name: read_alias)
    indices_for_alias(read_alias).each do |index|
      client.indices.delete_alias index: index, name: read_alias
    end
  end
end
setup() click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 49
def setup
  reset_aliases

  timestamp      = Time.now.strftime('%Y%m%d-%H%M%S')
  new_index_name = Documents.index_name + "_#{timestamp}"

  storage.create_index new_index_name
  client.indices.put_alias index: new_index_name, name: read_alias
  client.indices.put_alias index: new_index_name, name: write_alias
end
swap_index_alias(options) click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 60
def swap_index_alias(options)
  change_alias = options.fetch(:alias)
  new_index = options.fetch(:new)
  old_index = options.fetch(:old)

  client.indices.update_aliases body: {
    actions: [
      { remove: { index: old_index, alias: change_alias } },
      { add:    { index: new_index, alias: change_alias } },
    ]
  }
end

Private Instance Methods

bulk_index_operation_hash(document) click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 97
def bulk_index_operation_hash(document)
  {
    index: {
      _index: write_alias,
      _type:  document.class.type,
      _id:    document.id,
      data:   document.as_hash,
    }
  }
end
bulk_index_operations(documents) click to toggle source
# File lib/elasticsearch/extensions/documents/aliased_index_store.rb, line 93
def bulk_index_operations(documents)
  documents.collect { |document| bulk_index_operation_hash(document) }
end