module Elasticsearch::Model::Indexing::ClassMethods
Public Instance Methods
Creates an index with correct name, automatically passing `settings` and `mappings` defined in the model
@example Create an index for the `Article` model
Article.__elasticsearch__.create_index!
@example Forcefully create (delete first) an index for the `Article` model
Article.__elasticsearch__.create_index! force: true
@example Pass a specific index name
Article.__elasticsearch__.create_index! index: 'my-index'
# File lib/elasticsearch/model/indexing.rb, line 241 def create_index!(options={}) options = options.clone target_index = options.delete(:index) || self.index_name settings = options.delete(:settings) || self.settings.to_hash mappings = options.delete(:mappings) || self.mappings.to_hash delete_index!(options.merge index: target_index) if options[:force] unless index_exists?(index: target_index) options.delete(:force) self.client.indices.create({ index: target_index, body: { settings: settings, mappings: mappings } }.merge(options)) end end
Deletes the index with corresponding name
@example Delete the index for the `Article` model
Article.__elasticsearch__.delete_index!
@example Pass a specific index name
Article.__elasticsearch__.delete_index! index: 'my-index'
# File lib/elasticsearch/model/indexing.rb, line 286 def delete_index!(options={}) target_index = options.delete(:index) || self.index_name begin self.client.indices.delete index: target_index rescue Exception => e if e.class.to_s =~ /NotFound/ && options[:force] client.transport.transport.logger.debug("[!!!] Index does not exist (#{e.class})") if client.transport.transport.logger nil else raise e end end end
Returns true if the index exists
@example Check whether the model's index exists
Article.__elasticsearch__.index_exists?
@example Check whether a specific index exists
Article.__elasticsearch__.index_exists? index: 'my-index'
# File lib/elasticsearch/model/indexing.rb, line 270 def index_exists?(options={}) target_index = options[:index] || self.index_name self.client.indices.exists(index: target_index, ignore: 404) end
# File lib/elasticsearch/model/indexing.rb, line 222 def load_settings_from_io(settings) YAML.load(settings.read) end
Defines mappings for the index
@example Define mapping for model
class Article mapping dynamic: 'strict' do indexes :foo do indexes :bar end indexes :baz end end Article.mapping.to_hash # => { :article => # { :dynamic => "strict", # :properties=> # { :foo => { # :type=>"object", # :properties => { # :bar => { :type => "string" } # } # } # }, # :baz => { :type=> "string" } # } # }
@example Define index settings and mappings
class Article settings number_of_shards: 1 do mappings do indexes :foo end end end
@example Call the mapping method directly
Article.mapping(dynamic: 'strict') { indexes :foo, type: 'long' } Article.mapping.to_hash # => {:article=>{:dynamic=>"strict", :properties=>{:foo=>{:type=>"long"}}}}
The `mappings` and `settings` methods are accessible directly on the model class, when it doesn't already define them. Use the `__elasticsearch__` proxy otherwise.
# File lib/elasticsearch/model/indexing.rb, line 154 def mapping(options={}, &block) @mapping ||= Mappings.new(document_type, options) @mapping.options.update(options) unless options.empty? if block_given? @mapping.instance_eval(&block) return self else @mapping end end
Performs the “refresh” operation for the index (useful e.g. in tests)
@example Refresh the index for the `Article` model
Article.__elasticsearch__.refresh_index!
@example Pass a specific index name
Article.__elasticsearch__.refresh_index! index: 'my-index'
@see www.elastic.co/guide/en/elasticsearch/reference/current/indices-refresh.html
# File lib/elasticsearch/model/indexing.rb, line 313 def refresh_index!(options={}) target_index = options.delete(:index) || self.index_name begin self.client.indices.refresh index: target_index rescue Exception => e if e.class.to_s =~ /NotFound/ && options[:force] client.transport.transport.logger.debug("[!!!] Index does not exist (#{e.class})") if client.transport.transport.logger nil else raise e end end end
Define settings for the index
@example Define index settings
Article.settings(index: { number_of_shards: 1 }) Article.settings.to_hash # => {:index=>{:number_of_shards=>1}}
You can read settings from any object that responds to :read as long as its return value can be parsed as either YAML or JSON.
@example Define index settings from YAML file
# config/elasticsearch/articles.yml: # # index: # number_of_shards: 1 # Article.settings File.open("config/elasticsearch/articles.yml") Article.settings.to_hash # => { "index" => { "number_of_shards" => 1 } }
@example Define index settings from JSON file
# config/elasticsearch/articles.json: # # { "index": { "number_of_shards": 1 } } # Article.settings File.open("config/elasticsearch/articles.json") Article.settings.to_hash # => { "index" => { "number_of_shards" => 1 } }
# File lib/elasticsearch/model/indexing.rb, line 208 def settings(settings={}, &block) settings = YAML.load(settings.read) if settings.respond_to?(:read) @settings ||= Settings.new(settings) @settings.settings.update(settings) unless settings.empty? if block_given? self.instance_eval(&block) return self else @settings end end