Commit dab166f3dc1be02c1283986e3d69b96fd223a52a

Authored by Andrew Kane
1 parent acb266e4

Added refresh_interval option to reindex

CHANGELOG.md
1 1 ## 2.0.4 [unreleased]
2 2  
3 3 - Added support for queuing updates [experimental]
  4 +- Added `refresh_interval` option to `reindex`
4 5  
5 6 ## 2.0.3
6 7  
... ...
lib/searchkick/index.rb
... ... @@ -38,11 +38,22 @@ module Searchkick
38 38 client.indices.get_settings index: name
39 39 end
40 40  
  41 + def refresh_interval
  42 + settings.values.first["settings"]["index"]["refresh_interval"]
  43 + end
  44 +
41 45 def update_settings(settings)
42 46 client.indices.put_settings index: name, body: settings
43 47 end
44 48  
45   - def promote(new_name)
  49 + def promote(new_name, update_refresh_interval: false)
  50 + if update_refresh_interval
  51 + new_index = Searchkick::Index.new(new_name)
  52 + settings = options[:settings] || {}
  53 + refresh_interval = (settings[:index] && settings[:index][:refresh_interval]) || "1s"
  54 + new_index.update_settings(index: {refresh_interval: refresh_interval})
  55 + end
  56 +
46 57 old_indices =
47 58 begin
48 59 client.indices.get_alias(name: name).keys
... ... @@ -191,7 +202,7 @@ module Searchkick
191 202  
192 203 # https://gist.github.com/jarosan/3124884
193 204 # http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/
194   - def reindex_scope(scope, import: true, resume: false, retain: false, async: false)
  205 + def reindex_scope(scope, import: true, resume: false, retain: false, async: false, refresh_interval: nil)
195 206 if resume
196 207 index_name = all_indices.sort.last
197 208 raise Searchkick::Error, "No index to resume" unless index_name
... ... @@ -199,7 +210,9 @@ module Searchkick
199 210 else
200 211 clean_indices unless retain
201 212  
202   - index = create_index(index_options: scope.searchkick_index_options)
  213 + index_options = scope.searchkick_index_options
  214 + index_options.deep_merge!(settings: {index: {refresh_interval: refresh_interval}}) if refresh_interval
  215 + index = create_index(index_options: index_options)
203 216 end
204 217  
205 218 # check if alias exists
... ... @@ -209,12 +222,12 @@ module Searchkick
209 222  
210 223 # get existing indices to remove
211 224 unless async
212   - promote(index.name)
  225 + promote(index.name, update_refresh_interval: !refresh_interval.nil?)
213 226 clean_indices unless retain
214 227 end
215 228 else
216 229 delete if exists?
217   - promote(index.name)
  230 + promote(index.name, update_refresh_interval: !refresh_interval.nil?)
218 231  
219 232 # import after promotion
220 233 index.import_scope(scope, resume: resume, async: async, full: true) if import
... ... @@ -240,8 +253,8 @@ module Searchkick
240 253 elsif full && async
241 254 # TODO expire Redis key
242 255 primary_key = scope.primary_key
243   - starting_id = scope.minimum(primary_key)
244   - max_id = scope.maximum(primary_key)
  256 + starting_id = scope.minimum(primary_key) || 0
  257 + max_id = scope.maximum(primary_key) || 0
245 258 batches_count = ((max_id - starting_id + 1) / batch_size.to_f).ceil
246 259  
247 260 batches_count.times do |i|
... ...
test/reindex_test.rb
... ... @@ -39,4 +39,17 @@ class ReindexTest < Minitest::Test
39 39 Product.searchkick_index.promote(reindex[:index_name])
40 40 assert_search "product", ["Product A"]
41 41 end
  42 +
  43 + def test_refresh_interval
  44 + reindex = Product.reindex(refresh_interval: "30s", async: true)
  45 + index = Searchkick::Index.new(reindex[:index_name])
  46 + assert_nil Product.searchkick_index.refresh_interval
  47 + assert_equal "30s", index.refresh_interval
  48 +
  49 + Product.searchkick_index.promote(index.name, update_refresh_interval: true)
  50 + assert_equal "1s", index.refresh_interval
  51 + assert_equal "1s", Product.searchkick_index.refresh_interval
  52 + ensure
  53 + Product.reindex
  54 + end
42 55 end
... ...