Commit dab166f3dc1be02c1283986e3d69b96fd223a52a
1 parent
acb266e4
Exists in
master
and in
19 other branches
Added refresh_interval option to reindex
Showing
3 changed files
with
34 additions
and
7 deletions
Show diff stats
CHANGELOG.md
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 | ... | ... |