module Sunspot::Rails::Searchable::ClassMethods

Public Instance Methods

searchable?() click to toggle source

Classes that have been defined as searchable return true for this method.

Returns

true

# File lib/sunspot/rails/searchable.rb, line 378
def searchable?
  true
end
solr_atomic_update(updates = {}) click to toggle source

Update properties of existing records in the Solr index. Atomic updates available only for the stored properties.

Updates (passed as a hash)

updates should be specified as a hash, where key - is the object ID and values is hash with property name/values to be updated.

Examples

class Post < ActiveRecord::Base
  searchable do
    string :title, stored: true
    string :description, stored: true
  end
end

post1 = Post.create(title: 'A Title', description: nil)

# update single property
Post.atomic_update(post1.id => {description: 'New post description'})

Notice

all non-stored properties in Solr index will be lost after update. Read Solr wiki page: wiki.apache.org/solr/Atomic_Updates

# File lib/sunspot/rails/searchable.rb, line 310
def solr_atomic_update(updates = {})
  Sunspot.atomic_update(self, updates)
end
solr_atomic_update!(updates = {}) click to toggle source

Update properties of existing records in the Solr index atomically, and immediately commits.

See solr_atomic_update for information on options, etc.

# File lib/sunspot/rails/searchable.rb, line 320
def solr_atomic_update!(updates = {})
  Sunspot.atomic_update!(self, updates)
end
solr_clean_index_orphans(opts={}) click to toggle source

Find IDs of records of this class that are indexed in Solr but do not exist in the database, and remove them from Solr. Under normal circumstances, this should not be necessary; this method is provided in case something goes wrong.

Options (passed as a hash)

batch_size<Integer>

Override default batch size with which to load records

# File lib/sunspot/rails/searchable.rb, line 362
def solr_clean_index_orphans(opts={})
  solr_index_orphans(opts).each do |id|
    new do |fake_instance|
      fake_instance.id = id
    end.solr_remove_from_index
  end
end
solr_execute_search_ids(options = {}) { || ... } click to toggle source
# File lib/sunspot/rails/searchable.rb, line 398
def solr_execute_search_ids(options = {})
  search = yield
  search.raw_results.map { |raw_result| raw_result.primary_key.to_i }
end
solr_index(opts={}) click to toggle source

Add/update all existing records in the Solr index. The batch_size argument specifies how many records to load out of the database at a time. The default batch size is 50; if nil is passed, records will not be indexed in batches. By default, a commit is issued after each batch; passing false for batch_commit will disable this, and only issue a commit at the end of the process. If associated objects need to indexed also, you can specify include in format accepted by ActiveRecord to improve your sql select performance

Options (passed as a hash)

batch_size<Integer>

Batch size with which to load records. Passing 'nil' will skip batches. Default is 50.

batch_commit<Boolean>

Flag signalling if a commit should be done after after each batch is indexed, default is 'true'

include<Mixed>

include option to be passed to the ActiveRecord find, used for including associated objects that need to be indexed with the parent object, accepts all formats ActiveRecord::Base.find does

first_id

The lowest possible ID for this class. Defaults to 0, which is fine for integer IDs; string primary keys will need to specify something reasonable here.

Examples

# index in batches of 50, commit after each
Post.index 

# index all rows at once, then commit
Post.index(:batch_size => nil) 

# index in batches of 50, commit when all batches complete
Post.index(:batch_commit => false) 

# include the associated +author+ object when loading to index
Post.index(:include => :author)
# File lib/sunspot/rails/searchable.rb, line 257
def solr_index(opts={})
  options = {
    :batch_size => Sunspot.config.indexing.default_batch_size,
    :batch_commit => true,
    :include => self.sunspot_options[:include],
    :start => opts.delete(:first_id)
  }.merge(opts)

  if options[:batch_size].to_i > 0
    batch_counter = 0
    self.includes(options[:include]).find_in_batches(options.slice(:batch_size, :start)) do |records|

      solr_benchmark(options[:batch_size], batch_counter += 1) do
        Sunspot.index(records.select(&:indexable?))
        Sunspot.commit if options[:batch_commit]
      end

      options[:progress_bar].increment!(records.length) if options[:progress_bar]
    end
  else
    Sunspot.index! self.includes(options[:include]).select(&:indexable?)
  end

  # perform a final commit if not committing in batches
  Sunspot.commit unless options[:batch_commit]
end
solr_index_orphans(opts={}) click to toggle source

Return the IDs of records of this class that are indexed in Solr but do not exist in the database. Under normal circumstances, this should never happen, but this method is provided in case something goes wrong. Usually you will want to rectify the situation by calling clean_index_orphans or reindex

Options (passed as a hash)

batch_size<Integer>

Override default batch size with which to load records.

Returns

Array

Collection of IDs that exist in Solr but not in the database

# File lib/sunspot/rails/searchable.rb, line 338
def solr_index_orphans(opts={})
  batch_size = opts[:batch_size] || Sunspot.config.indexing.default_batch_size          

  solr_page = 0
  solr_ids = []
  while (solr_page = solr_page.next)
    ids = solr_search_ids { paginate(:page => solr_page, :per_page => batch_size) }.to_a
    break if ids.empty?
    solr_ids.concat ids
  end

  return solr_ids - self.connection.select_values("SELECT id FROM #{quoted_table_name}").collect(&:to_i)
end
solr_reindex(options = {}) click to toggle source

Completely rebuild the index for this class. First removes all instances from the index, then loads records and indexes them.

See index for information on options, etc.

# File lib/sunspot/rails/searchable.rb, line 214
def solr_reindex(options = {})
  solr_remove_all_from_index
  solr_index(options)
end
solr_remove_all_from_index() click to toggle source

Remove instances of this class from the Solr index.

# File lib/sunspot/rails/searchable.rb, line 195
def solr_remove_all_from_index
  Sunspot.remove_all(self)
end
solr_remove_all_from_index!() click to toggle source

Remove all instances of this class from the Solr index and immediately commit.

# File lib/sunspot/rails/searchable.rb, line 204
def solr_remove_all_from_index!
  Sunspot.remove_all!(self)
end
solr_search_ids(&block) click to toggle source

Get IDs of matching results without loading the result objects from the database. This method may be useful if search is used as an intermediate step in a larger find operation. The block is the same as the block provided to the search method.

Returns

Array

Array of IDs, in the order returned by the search

# File lib/sunspot/rails/searchable.rb, line 186
def solr_search_ids(&block)
  solr_execute_search_ids do
    solr_search(&block)
  end
end

Protected Instance Methods

solr_benchmark(batch_size, counter) { || ... } click to toggle source

Does some logging for benchmarking indexing performance

# File lib/sunspot/rails/searchable.rb, line 408
def solr_benchmark(batch_size, counter,  &block)
  start = Time.now
  logger.info("[#{Time.now}] Start Indexing")
  yield
  elapsed = Time.now-start
  logger.info("[#{Time.now}] Completed Indexing. Rows indexed #{counter * batch_size}. Rows/sec: #{batch_size/elapsed.to_f} (Elapsed: #{elapsed} sec.)")
end