Module: Sunspot::Rails::Searchable::ClassMethods

Defined in:
sunspot_rails/lib/sunspot/rails/searchable.rb

Class Method Summary (collapse)

Instance Method Summary (collapse)

Class Method Details

+ (Object) extended(base)

:nodoc:



117
118
119
120
121
122
123
124
125
126
127
128
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 117

def self.extended(base) #:nodoc:
  class <<base
    alias_method :search, :solr_search unless method_defined? :search
    alias_method :search_ids, :solr_search_ids unless method_defined? :search_ids
    alias_method :remove_all_from_index, :solr_remove_all_from_index unless method_defined? :remove_all_from_index
    alias_method :remove_all_from_index!, :solr_remove_all_from_index! unless method_defined? :remove_all_from_index!
    alias_method :reindex, :solr_reindex unless method_defined? :reindex
    alias_method :index, :solr_index unless method_defined? :index
    alias_method :index_orphans, :solr_index_orphans unless method_defined? :index_orphans
    alias_method :clean_index_orphans, :solr_clean_index_orphans unless method_defined? :clean_index_orphans
  end
end

Instance Method Details

- (Boolean) searchable?

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

Returns

true

Returns:

  • (Boolean)


312
313
314
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 312

def searchable?
  true
end

- (Object) solr_clean_index_orphans

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.



296
297
298
299
300
301
302
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 296

def solr_clean_index_orphans
  solr_index_orphans.each do |id|
    new do |fake_instance|
      fake_instance.id = id
    end.solr_remove_from_index
  end
end

- (Object) solr_execute_search(options = {})



316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 316

def solr_execute_search(options = {})
  options.assert_valid_keys(:include, :select)
  search = yield
  unless options.empty?
    search.build do |query|
      if options[:include]
        query.data_accessor_for(self).include = options[:include]
      end
      if options[:select]
        query.data_accessor_for(self).select = options[:select]
      end
    end
  end
  search.execute
end

- (Object) solr_execute_search_ids(options = {})



332
333
334
335
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 332

def solr_execute_search_ids(options = {})
  search = yield
  search.raw_results.map { |raw_result| raw_result.primary_key.to_i }
end

- (Object) solr_index(opts = {})

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

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

batch_commit

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

include

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 <tt>author</tt> object when loading to index
  Post.index(:include => :author)


239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 239

def solr_index(opts={})
  options = {
    :batch_size => 50,
    :batch_commit => true,
    :include => self.sunspot_options[:include],
    :start => opts.delete(:first_id) || 0
  }.merge(opts)
  find_in_batch_options = {
    :include => options[:include],
    :batch_size => options[:batch_size],
    :start => options[:first_id]
  }
  progress_bar = options[:progress_bar]
  if options[:batch_size]
    batch_counter = 0
    find_in_batches(find_in_batch_options) do |records|
      solr_benchmark options[:batch_size], batch_counter do
        Sunspot.index(records.select { |model| model.indexable? })
        Sunspot.commit if options[:batch_commit]
      end
      # track progress
      progress_bar.increment!(records.length) if progress_bar
      batch_counter += 1
    end
  else
    records = all(:include => options[:include]).select { |model| model.indexable? }
    Sunspot.index!(records)
  end
  # perform a final commit if not committing in batches
  Sunspot.commit unless options[:batch_commit]
end

- (Object) solr_index_orphans

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

Returns

Array

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



281
282
283
284
285
286
287
288
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 281

def solr_index_orphans
  count = self.count
  indexed_ids = solr_search_ids { paginate(:page => 1, :per_page => count) }.to_set
  all(:select => 'id').each do |object|
    indexed_ids.delete(object.id)
  end
  indexed_ids.to_a
end

- (Object) solr_reindex(options = {})

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.



196
197
198
199
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 196

def solr_reindex(options = {})
  solr_remove_all_from_index
  solr_index(options)
end

- (Object) solr_remove_all_from_index

Remove instances of this class from the Solr index.



177
178
179
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 177

def solr_remove_all_from_index
  Sunspot.remove_all(self)
end

- (Object) solr_remove_all_from_index!

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



186
187
188
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 186

def solr_remove_all_from_index!
  Sunspot.remove_all!(self)
end

- (Object) solr_search(options = {}, &block)

Search for instances of this class in Solr. The block is delegated to the Sunspot.search method - see the Sunspot documentation for the full API.

Example

  Post.search(:include => [:blog]) do
    keywords 'best pizza'
    with :blog_id, 1
    order :updated_at, :desc
    facet :category_ids
  end

Options

:include

Specify associations to eager load

:select

Specify columns to select from database when loading results

Returns

Sunspot::Search

Object containing results, totals, facets, etc.



152
153
154
155
156
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 152

def solr_search(options = {}, &block)
  solr_execute_search(options) do
    Sunspot.new_search(self, &block)
  end
end

- (Object) solr_search_ids(&block)

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



168
169
170
171
172
# File 'sunspot_rails/lib/sunspot/rails/searchable.rb', line 168

def solr_search_ids(&block)
  solr_execute_search_ids do
    solr_search(&block)
  end
end