Skip to content

Instantly share code, notes, and snippets.

@rubyconvict
Forked from VvanGemert/bulk_reindexer.rb
Last active February 15, 2023 21:42
Show Gist options
  • Save rubyconvict/64332fa939991558de3d56a349bf25e0 to your computer and use it in GitHub Desktop.
Save rubyconvict/64332fa939991558de3d56a349bf25e0 to your computer and use it in GitHub Desktop.
Asynchronous bulk reindexing module for Searchkick with Sidekiq
# https://medium.com/rubyinside/asynchronous-elasticsearch-bulk-reindexing-with-rails-searchkick-and-sidekiq-26f2f9aa8513
# https://github.com/ankane/searchkick
# 2.3.2 [unreleased]
# - Added wait option to async reindex
# Searchkick.reindex(async: {wait: true})
# This code has been ported to searchkick.
require 'sidekiq/api'
# BulkReindexer
module BulkReindexer
def self.reindex_model(model, promote_and_clean = true)
puts "Reindexing #{model.name}..."
index = model.reindex(async: true, refresh_interval: '30s')
puts "All jobs are in queue. Index name: #{index[:index_name]}"
loop do
# Check the size of queue
queue_size = Sidekiq::Queue.new('searchkick').size
puts "Jobs left: #{queue_size}"
# Check every 5 seconds
sleep 5
break if queue_size.zero?
end
puts 'Jobs complete. Promoting...'
promote_and_clean(model, index) if promote_and_clean
end
def self.promote_and_clean(model, index)
model.search_index.promote(index[:index_name],
update_refresh_interval: true)
puts "Reindex of #{model.name} complete."
puts 'Cleaning old indices'
model.search_index.clean_indices
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment