Module: Chewy::Index::Actions::ClassMethods

Defined in:
lib/chewy/index/actions.rb

Instance Method Summary collapse

Instance Method Details

#clear_cache(args = {index: index_name}) ⇒ Object



196
197
198
# File 'lib/chewy/index/actions.rb', line 196

def clear_cache(args = {index: index_name})
  client.indices.clear_cache(args)
end

#create(*args, **kwargs) ⇒ Object

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/).



34
35
36
37
38
# File 'lib/chewy/index/actions.rb', line 34

def create(*args, **kwargs)
  create!(*args, **kwargs)
rescue Elastic::Transport::Transport::Errors::BadRequest
  false
end

#create!(suffix = nil, **options) ⇒ Object

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/).



56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/chewy/index/actions.rb', line 56

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) ⇒ Object

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


77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/chewy/index/actions.rb', line 77

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 Elastic::Transport::Transport::Errors::NotFound
  # by itself, rescue is for previous versions
rescue Elastic::Transport::Transport::Errors::NotFound
  false
end

#delete!(suffix = nil) ⇒ Object

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


102
103
104
105
106
# File 'lib/chewy/index/actions.rb', line 102

def delete!(suffix = nil)
  # es-ruby >= 1.0.10 handles Elastic::Transport::Transport::Errors::NotFound
  # by itself, so it is raised here
  delete(suffix) or raise Elastic::Transport::Transport::Errors::NotFound
end

#exists?(suffix = nil) ⇒ Boolean

Checks index existance. Supports suffixes. Returns true or false

UsersIndex.exists? #=> true
UsersIndex.exists?('11-2024') #=> false

Returns:

  • (Boolean)


15
16
17
# File 'lib/chewy/index/actions.rb', line 15

def exists?(suffix = nil)
  client.indices.exists(index: index_name(suffix: suffix))
end

#journalChewy::Journal

A Journal instance for the particular index

Returns:



192
193
194
# File 'lib/chewy/index/actions.rb', line 192

def journal
  @journal ||= Chewy::Journal.new(self)
end

#purge(suffix = nil) ⇒ Object

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`


114
115
116
117
118
# File 'lib/chewy/index/actions.rb', line 114

def purge(suffix = nil)
  delete if suffix.present?
  delete suffix
  create suffix
end

#purge!(suffix = nil) ⇒ Object

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`


127
128
129
130
131
# File 'lib/chewy/index/actions.rb', line 127

def purge!(suffix = nil)
  delete if suffix.present? && exists?
  delete suffix
  create! suffix
end

#reindex(source: index_name, dest: index_name) ⇒ Object



200
201
202
203
204
205
206
207
208
209
210
# File 'lib/chewy/index/actions.rb', line 200

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) ⇒ true, false Also known as: reset

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.

Examples:

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

Parameters:

  • suffix (String) (defaults to: nil)

    a suffix for the newly created index

  • apply_journal (true, false) (defaults to: true)

    if true, journal is applied after the import is completed

  • journal (true, false) (defaults to: false)

    journaling is switched off for import during reset by default

  • import_options (Hash)

    options, passed to the import call

Returns:

  • (true, false)

    false in case of errors

See Also:



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/chewy/index/actions.rb', line 150

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

    actions = indexes.map { |index| {remove: {index: index, alias: general_name}} }
    actions << {add: {index: suffixed_name, alias: general_name}}
    if indexes.blank? && exists?
      index_names = client.indices.get_alias(index: general_name).keys
      actions << {remove_index: {index: index_names.join(',')}}
    end

    client.indices.update_aliases body: {actions: actions}
    client.indices.delete index: indexes if indexes.present?

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

  specification.lock!
  result
end

#sync(parallel: nil) ⇒ Hash{Symbol, Object}?

Performs missing and outdated objects synchronization for the current index.

Examples:

UsersIndex.sync

Parameters:

  • parallel (true, Integer, Hash) (defaults to: nil)

    options for parallel execution or the number of processes

Returns:

  • (Hash{Symbol, Object}, nil)

    a number of missing and outdated documents re-indexed and their ids, nil in case of errors

See Also:



234
235
236
237
238
# File 'lib/chewy/index/actions.rb', line 234

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) ⇒ Object

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

Examples:

Chewy.client.update_mapping('cities', {properties: {new_field: {type: :text}}})


218
219
220
221
222
223
# File 'lib/chewy/index/actions.rb', line 218

def update_mapping(name = index_name, body = root.mappings_hash)
  client.indices.put_mapping(
    index: name,
    body: body
  )['acknowledged']
end