module Chewy::Index::Actions::ClassMethods

Public Instance Methods

clear_cache(args = {index: index_name}) click to toggle source
# File lib/chewy/index/actions.rb, line 194
def clear_cache(args = {index: index_name})
  client.indices.clear_cache(args)
end
create(*args, **kwargs) click to toggle source

Creates index and applies mappings and settings. Returns false in case of unsuccessful creation.

UsersIndex.create # creates index named `users`

Index name suffix might be passed optionally. In this case, method creates index with suffix and makes unsuffixed alias for it.

UsersIndex.create '01-2013' # creates index `users_01-2013` and alias `users` for it
UsersIndex.create '01-2013', alias: false # creates index `users_01-2013` only and no alias

Suffixed index names might be used for zero-downtime mapping change, for example. Description: (www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/).

# File lib/chewy/index/actions.rb, line 33
def create(*args, **kwargs)
  create!(*args, **kwargs)
rescue Elasticsearch::Transport::Transport::Errors::BadRequest
  false
end
create!(suffix = nil, **options) click to toggle source

Creates index and applies mappings and settings. Raises elasticsearch-ruby transport error in case of unsuccessfull creation.

UsersIndex.create! # creates index named `users`

Index name suffix might be passed optionally. In this case, method creates index with suffix and makes unsuffixed alias for it.

UsersIndex.create! '01-2014' # creates index `users_01-2014` and alias `users` for it
UsersIndex.create! '01-2014', alias: false # creates index `users_01-2014` only and no alias

Suffixed index names might be used for zero-downtime mapping change, for example. Description: (www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/).

# File lib/chewy/index/actions.rb, line 55
def create!(suffix = nil, **options)
  options.reverse_merge!(alias: true)
  general_name = index_name
  suffixed_name = index_name(suffix: suffix)

  body = specification_hash
  body[:aliases] = {general_name => {}} if options[:alias] && suffixed_name != general_name
  result = client.indices.create(index: suffixed_name, body: body)

  Chewy.wait_for_status if result
  result
end
delete(suffix = nil) click to toggle source

Deletes ES index. Returns false in case of error.

UsersIndex.delete # deletes `users` index

Supports index suffix passed as the first argument

UsersIndex.delete '01-2014' # deletes `users_01-2014` index
# File lib/chewy/index/actions.rb, line 76
def delete(suffix = nil)
  # Verify that the index_name is really the index_name and not an alias.
  #
  #   "The index parameter in the delete index API no longer accepts alias names.
  #   Instead, it accepts only index names (or wildcards which will expand to matching indices)."
  #   https://www.elastic.co/guide/en/elasticsearch/reference/6.8/breaking-changes-6.0.html#_delete_index_api_resolves_indices_expressions_only_against_indices
  index_names = client.indices.get_alias(index: index_name(suffix: suffix)).keys
  result = client.indices.delete index: index_names.join(',')
  Chewy.wait_for_status if result
  result
  # es-ruby >= 1.0.10 handles Elasticsearch::Transport::Transport::Errors::NotFound
  # by itself, rescue is for previous versions
rescue Elasticsearch::Transport::Transport::Errors::NotFound
  false
end
delete!(suffix = nil) click to toggle source

Deletes ES index. Raises elasticsearch-ruby transport error in case of error.

UsersIndex.delete # deletes `users` index

Supports index suffix passed as the first argument

UsersIndex.delete '01-2014' # deletes `users_01-2014` index
# File lib/chewy/index/actions.rb, line 101
def delete!(suffix = nil)
  # es-ruby >= 1.0.10 handles Elasticsearch::Transport::Transport::Errors::NotFound
  # by itself, so it is raised here
  delete(suffix) or raise Elasticsearch::Transport::Transport::Errors::NotFound
end
exists?() click to toggle source

Checks index existance. Returns true or false

UsersIndex.exists? #=> true
# File lib/chewy/index/actions.rb, line 14
def exists?
  client.indices.exists(index: index_name)
end
journal() click to toggle source

A {Chewy::Journal} instance for the particular index

@return [Chewy::Journal] journal instance

# File lib/chewy/index/actions.rb, line 190
def journal
  @journal ||= Chewy::Journal.new(self)
end
purge(suffix = nil) click to toggle source

Deletes and recreates index. Supports suffixes. Returns result of index creation.

UsersIndex.purge # deletes and creates `users` index
UsersIndex.purge '01-2014' # deletes `users` and `users_01-2014` indexes, creates `users_01-2014`
# File lib/chewy/index/actions.rb, line 113
def purge(suffix = nil)
  delete if suffix.present?
  delete suffix
  create suffix
end
purge!(suffix = nil) click to toggle source

Deletes and recreates index. Supports suffixes. Returns result of index creation. Raises error in case of unsuccessfull creation

UsersIndex.purge! # deletes and creates `users` index
UsersIndex.purge! '01-2014' # deletes `users` and `users_01-2014` indexes, creates `users_01-2014`
# File lib/chewy/index/actions.rb, line 126
def purge!(suffix = nil)
  delete if suffix.present? && exists?
  delete suffix
  create! suffix
end
reindex(source: index_name, dest: index_name) click to toggle source
# File lib/chewy/index/actions.rb, line 198
def reindex(source: index_name, dest: index_name)
  client.reindex(
    {
      body:
        {
          source: {index: source},
          dest: {index: dest}
        }
    }
  )
end
reset(suffix = nil, apply_journal: true, journal: false, **import_options)
Alias for: reset!
reset!(suffix = nil, apply_journal: true, journal: false, **import_options) click to toggle source

Deletes, creates and imports data to the index. Returns the import result. If index name suffix is passed as the first argument - performs zero-downtime index resetting.

It also applies journal if anything was journaled during the reset.

@example

UsersIndex.reset!
UsersIndex.reset! Time.now.to_i

@see www.elasticsearch.org/blog/changing-mapping-with-zero-downtime @param suffix [String] a suffix for the newly created index @param apply_journal [true, false] if true, journal is applied after the import is completed @param journal [true, false] journaling is switched off for import during reset by default @param import_options [Hash] options, passed to the import call @return [true, false] false in case of errors

# File lib/chewy/index/actions.rb, line 149
def reset!(suffix = nil, apply_journal: true, journal: false, **import_options)
  result = if suffix.present?
    start_time = Time.now
    indexes = self.indexes - [index_name]
    create! suffix, alias: false

    general_name = index_name
    suffixed_name = index_name(suffix: suffix)

    optimize_index_settings suffixed_name
    result = import import_options.merge(
      suffix: suffix,
      journal: journal,
      refresh: !Chewy.reset_disable_refresh_interval
    )
    original_index_settings suffixed_name

    delete if indexes.blank?
    client.indices.update_aliases body: {actions: [
      *indexes.map do |index|
        {remove: {index: index, alias: general_name}}
      end,
      {add: {index: suffixed_name, alias: general_name}}
    ]}
    client.indices.delete index: indexes if indexes.present?

    self.journal.apply(start_time, **import_options) if apply_journal
    result
  else
    purge!
    import import_options.merge(journal: journal)
  end

  specification.lock!
  result
end
Also aliased as: reset
sync(parallel: nil) click to toggle source

Performs missing and outdated objects synchronization for the current index.

@example

UsersIndex.sync

@see Chewy::Index::Syncer @param parallel [true, Integer, Hash] options for parallel execution or the number of processes @return [Hash{Symbol, Object}, nil] a number of missing and outdated documents re-indexed and their ids,

nil in case of errors
# File lib/chewy/index/actions.rb, line 232
def sync(parallel: nil)
  syncer = Syncer.new(self, parallel: parallel)
  count = syncer.perform
  {count: count, missing: syncer.missing_ids, outdated: syncer.outdated_ids} if count
end
update_mapping(name = index_name, body = root.mappings_hash) click to toggle source

Adds new fields to an existing data stream or index. Change the search settings of existing fields.

@example

Chewy.client.update_mapping('cities', {properties: {new_field: {type: :text}}})
# File lib/chewy/index/actions.rb, line 216
def update_mapping(name = index_name, body = root.mappings_hash)
  client.indices.put_mapping(
    index: name,
    body: body
  )['acknowledged']
end

Private Instance Methods

index_settings(setting_name) click to toggle source
# File lib/chewy/index/actions.rb, line 261
def index_settings(setting_name)
  return {} unless settings_hash.key?(:settings) && settings_hash[:settings].key?(:index)

  settings_hash[:settings][:index].slice(setting_name)
end
optimize_index_settings(index_name) click to toggle source
# File lib/chewy/index/actions.rb, line 240
def optimize_index_settings(index_name)
  settings = {}
  settings[:refresh_interval] = -1 if Chewy.reset_disable_refresh_interval
  settings[:number_of_replicas] = 0 if Chewy.reset_no_replicas
  update_settings index_name, settings: settings if settings.any?
end
original_index_settings(index_name) click to toggle source
# File lib/chewy/index/actions.rb, line 247
def original_index_settings(index_name)
  settings = {}
  if Chewy.reset_disable_refresh_interval
    settings.merge! index_settings(:refresh_interval)
    settings[:refresh_interval] = '1s' if settings.empty?
  end
  settings.merge! index_settings(:number_of_replicas) if Chewy.reset_no_replicas
  update_settings index_name, settings: settings if settings.any?
end
update_settings(index_name, **options) click to toggle source
# File lib/chewy/index/actions.rb, line 257
def update_settings(index_name, **options)
  client.indices.put_settings index: index_name, body: {index: options[:settings]}
end