Module: Sunspot::Rails::Searchable::ClassMethods
- Defined in:
- sunspot_rails/lib/sunspot/rails/searchable.rb
Class Method Summary (collapse)
-
+ (Object) extended(base)
:nodoc:.
Instance Method Summary (collapse)
-
- (Boolean) searchable?
Classes that have been defined as searchable return true for this method.
-
- (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.
- - (Object) solr_execute_search(options = {})
- - (Object) solr_execute_search_ids(options = {})
-
- (Object) solr_index(opts = {})
Add/update all existing records in the Solr index.
-
- (Object) solr_index_orphans
Return the IDs of records of this class that are indexed in Solr but do not exist in the database.
-
- (Object) solr_reindex(options = {})
Completely rebuild the index for this class.
-
- (Object) solr_remove_all_from_index
Remove instances of this class from the Solr index.
-
- (Object) solr_remove_all_from_index!
Remove all instances of this class from the Solr index and immediately commit.
-
- (Object) solr_search(options = {}, &block)
Search for instances of this class in Solr.
-
- (Object) solr_search_ids(&block)
Get IDs of matching results without loading the result objects from the database.
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
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( = {}) .assert_valid_keys(:include, :select) search = yield unless .empty? search.build do |query| if [:include] query.data_accessor_for(self).include = [:include] end if [:select] query.data_accessor_for(self).select = [: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( = {}) 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={}) = { :batch_size => 50, :batch_commit => true, :include => self.[:include], :start => opts.delete(:first_id) || 0 }.merge(opts) = { :include => [:include], :batch_size => [:batch_size], :start => [:first_id] } = [:progress_bar] if [:batch_size] batch_counter = 0 find_in_batches() do |records| solr_benchmark [:batch_size], batch_counter do Sunspot.index(records.select { |model| model.indexable? }) Sunspot.commit if [:batch_commit] end # track progress .increment!(records.length) if batch_counter += 1 end else records = all(:include => [:include]).select { |model| model.indexable? } Sunspot.index!(records) end # perform a final commit if not committing in batches Sunspot.commit unless [: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( = {}) solr_remove_all_from_index solr_index() 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( = {}, &block) solr_execute_search() 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 |