Classes that have been defined as searchable return true for
this method.
true
# File lib/sunspot/rails/searchable.rb, line 372 def searchable? true end
Update properties of existing records in the Solr index. Atomic updates available only for the stored properties.
updates should be specified as a hash, where key - is the object ID and values is hash with property name/values to be updated.
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'})
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 304 def solr_atomic_update(updates = {}) Sunspot.atomic_update(self, updates) end
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 314 def solr_atomic_update!(updates = {}) Sunspot.atomic_update!(self, updates) end
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.
Override default batch size with which to load records
# File lib/sunspot/rails/searchable.rb, line 356 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
# File lib/sunspot/rails/searchable.rb, line 376 def solr_execute_search(options = {}) inherited_attributes = [:include, :select, :scopes] options.assert_valid_keys(*inherited_attributes) search = yield unless options.empty? search.build do |query| inherited_attributes.each do |attr| if options[attr] query.data_accessor_for(self).send("#{attr}=", options[attr]) end end end end search.execute end
# File lib/sunspot/rails/searchable.rb, line 392 def solr_execute_search_ids(options = {}) search = yield search.raw_results.map { |raw_result| raw_result.primary_key.to_i } end
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
Batch size with which to load records. Passing ‘nil’ will skip batches. Default is 50.
Flag signalling if a commit should be done after after each batch is indexed, default is ‘true’
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
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.
# 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 251 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
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
Override default batch size with which to load records.
Collection of IDs that exist in Solr but not in the database
# File lib/sunspot/rails/searchable.rb, line 332 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
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 208 def solr_reindex(options = {}) solr_remove_all_from_index solr_index(options) end
Remove instances of this class from the Solr index.
# File lib/sunspot/rails/searchable.rb, line 189 def solr_remove_all_from_index Sunspot.remove_all(self) end
Remove all instances of this class from the Solr index and immediately commit.
# File lib/sunspot/rails/searchable.rb, line 198 def solr_remove_all_from_index! Sunspot.remove_all!(self) end
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.
Post.search(:include => [:blog]) do keywords 'best pizza' with :blog_id, 1 order :updated_at, :desc facet :category_ids end
Specify associations to eager load
Specify columns to select from database when loading results
Object containing results, totals, facets, etc.
# File lib/sunspot/rails/searchable.rb, line 164 def solr_search(options = {}, &block) solr_execute_search(options) do Sunspot.new_search(self, &block) end end
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.
Array of IDs, in the order returned by the search
# File lib/sunspot/rails/searchable.rb, line 180 def solr_search_ids(&block) solr_execute_search_ids do solr_search(&block) end end
Does some logging for benchmarking indexing performance
# File lib/sunspot/rails/searchable.rb, line 402 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