module Mongoid::SearchIndexable::ClassMethods

Implementations for the feature’s class-level methods.

Public Instance Methods

create_search_indexes() click to toggle source

Request the creation of all registered search indices. Note that the search indexes are created asynchronously, and may take several minutes to be fully available.

@return [ Array<String> ] The names of the search indexes.

# File lib/mongoid/search_indexable.rb, line 65
def create_search_indexes
  return if search_index_specs.empty?

  collection.search_indexes.create_many(search_index_specs)
end
remove_search_index(name: nil, id: nil) click to toggle source

Removes the search index specified by the given name or id. Either name OR id must be given, but not both.

@param [ String | nil ] name the name of the index to remove @param [ String | nil ] id the id of the index to remove

# File lib/mongoid/search_indexable.rb, line 107
def remove_search_index(name: nil, id: nil)
  logger.info(
    "MONGOID: Removing search index '#{name || id}' " \
    "on collection '#{collection.name}'."
  )

  collection.search_indexes.drop_one(name: name, id: id)
end
remove_search_indexes() click to toggle source

Request the removal of all registered search indexes. Note that the search indexes are removed asynchronously, and may take several minutes to be fully deleted.

@note It would be nice if this could remove ONLY the search indexes that have been declared on the model, but because the model may not name the index, we can’t guarantee that we’ll know the name or id of the corresponding indexes. It is not unreasonable to assume, though, that the intention is for the model to declare, one-to-one, all desired search indexes, so removing all search indexes ought to suffice. If a specific index or set of indexes needs to be removed instead, consider using search_indexes.each with remove_search_index.

# File lib/mongoid/search_indexable.rb, line 128
def remove_search_indexes
  search_indexes.each do |spec|
    remove_search_index id: spec['id']
  end
end
search_index(name_or_defn, defn = nil) click to toggle source

Adds an index definition for the provided single or compound keys.

@example Create a basic index.

class Person
  include Mongoid::Document
  field :name, type: String
  search_index({ ... })
  search_index :name_of_index, { ... }
end

@param [ Symbol | String | Hash ] name_or_defn Either the name of the index to

define, or the index definition.

@param [ Hash ] defn The search index definition.

# File lib/mongoid/search_indexable.rb, line 147
def search_index(name_or_defn, defn = nil)
  name = name_or_defn
  name, defn = nil, name if name.is_a?(Hash)

  spec = { definition: defn }.tap { |s| s[:name] = name.to_s if name }
  search_index_specs.push(spec)
end
search_indexes(options = {}) click to toggle source

A convenience method for querying the search indexes available on the current model’s collection.

@param [ Hash ] options the options to pass through to the search

index query.

@option options [ String ] :id The id of the specific index to query (optional) @option options [ String ] :name The name of the specific index to query (optional) @option options [ Hash ] :aggregate The options hash to pass to the

aggregate command (optional)
# File lib/mongoid/search_indexable.rb, line 98
def search_indexes(options = {})
  collection.search_indexes(options)
end
wait_for_search_indexes(names, interval: 5) { |status| ... } click to toggle source

Waits for the named search indexes to be created.

@param [ Array<String> ] names the list of index names to wait for @param [ Integer ] interval the number of seconds to wait before

polling again (only used when a progress callback is given).

@yield [ SearchIndexable::Status ] the status object

# File lib/mongoid/search_indexable.rb, line 78
def wait_for_search_indexes(names, interval: 5)
  loop do
    status = Status.new(get_indexes(names))
    yield status if block_given?
    break if status.ready?

    sleep interval
  end
end

Private Instance Methods

get_indexes(names) click to toggle source

Retrieves the index records for the indexes with the given names.

@param [ Array<String> ] names the index names to query

@return [ Array<Hash> ] the raw index documents

# File lib/mongoid/search_indexable.rb, line 162
def get_indexes(names)
  collection.search_indexes.select { |i| names.include?(i['name']) }
end