Skip to content

Instantly share code, notes, and snippets.

@nz
Last active July 10, 2023 21:35
Show Gist options
  • Save nz/1282013 to your computer and use it in GitHub Desktop.
Save nz/1282013 to your computer and use it in GitHub Desktop.
Sunspot with Resque
# app/models/post.rb
class Post
searchable :auto_index => false, :auto_remove => false do
text :title
text :body
end
after_commit :resque_solr_update, :if => :persisted?
before_destroy :resque_solr_remove
protected
def resque_solr_update
Resque.enqueue(SolrUpdate, self.class.to_s, id)
end
def resque_solr_remove
Resque.enqueue(SolrRemove, self.class.to_s, id)
end
end
# lib/jobs/solr_update.rb
class SolrUpdate
@queue = :solr
def self.perform(classname, id)
classname.constantize.find(id).solr_index
end
end
# lib/jobs/solr_remove.rb
class SolrRemove
@queue = :solr
def self.perform(classname, id)
Sunspot.remove_by_id(classname, id)
end
end
@nz
Copy link
Author

nz commented Apr 18, 2012

Sounds like I'll need to work on a more general solution of this. Thanks for sharing your version @ciaranlee that looks pretty good.

Would be happy to merge something like this into Sunspot proper. If any of you want to put that together, branch it off 1-3-stable and /cc me in the pull request.

@ciaranlee
Copy link

I'll try to do that over the next few days!

@gudleik
Copy link

gudleik commented May 16, 2012

When removing an index, the object might already be destroyed when the worker calls find.
You can use Sunspot.remove_by_id instead:

class SolrRemove
  @queue = :solr

  def self.perform(classname, id)
    Sunspot.remove_by_id classname, id
  end  

end

@nz
Copy link
Author

nz commented May 18, 2012

Good point, @gudleik, thanks! Updated.

@gaffneyc
Copy link

I just released a gem for doing just this called sunspot-queue (https://github.com/gaffneyc/sunspot-queue).

@semmin
Copy link

semmin commented Sep 4, 2012

Great snippet, just what I was looking for, thanks. However, Nick, when is the Sunspot.commit performed in this scenario?

@nz
Copy link
Author

nz commented Nov 7, 2012

@semmin, usually best to avoid issuing explicit commits and instead rely on your server's autoCommit setting in the solrconfig.xml.

@semmin
Copy link

semmin commented Mar 31, 2013

I had to modify line 10 as follows: after_commit :resque_solr_update, if: :persisted? since resque_solr_update was triggered on delete operations.

@nz
Copy link
Author

nz commented Apr 1, 2013

Thanks, @semmin!

@leoromanovsky
Copy link

What do you think of adding this at the end of the Resque jobs, for specs and local development to work somewhat serially?

unless Rails.env.production?
  Sunspot.commit
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment