Class: Esteem::Reindex
- Inherits:
-
Object
- Object
- Esteem::Reindex
- Defined in:
- lib/esteem/reindex.rb
Overview
Cribbed from geronime’s “es-reindex” script: github.com/geronime/es-reindex
Instance Attribute Summary collapse
-
#success ⇒ Object
readonly
Returns the value of attribute success.
Instance Method Summary collapse
-
#initialize(source:, destination:, frame:, update:) ⇒ Reindex
constructor
Perform a new reindex job.
Constructor Details
#initialize(source:, destination:, frame:, update:) ⇒ Reindex
Perform a new reindex job. Success or failure will be reported by the read-only “success” attribute.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/esteem/reindex.rb', line 21 def initialize source:, destination:, frame:, update: src, dst = source, destination @success = false type, src = src.reverse.split('/', 2).map(&:reverse) surl, durl, sidx, didx = '', '', '', '' [[src, surl, sidx], [dst, durl, didx]].each{|param, url, idx| if param =~ %r{^(.*)/(.*?)$} url.replace $1 idx.replace $2 else url.replace 'http://127.0.0.1:9200' idx.replace param end } puts "Copying '%s/%s/%s' to '%s/%s'" % [ surl, sidx, type, durl, didx ] scount = retried_request :get, "#{surl}/#{sidx}/#{type}/_count?q=*" scount = Oj.load(scount)['count'].to_i puts "%d documents" % scount if scount == 0 puts "Hey, this index is empty! Skipping..." @success = true return end t, done = Time.now, 0 shards = retried_request :get, "#{surl}/#{sidx}/_count?q=*" shards = Oj.load(shards)['_shards']['total'].to_i scan = retried_request(:get, "#{surl}/#{sidx}/#{type}/_search?search_type=scan&scroll=10m&size=#{frame / shards}") scan = Oj.load scan scroll_id = scan['_scroll_id'] total = scan['hits']['total'] printf " %u/%u (%.1f%%) done.\r", done, total, 0 bulk_op = update ? "index" : "create" loop do data = retried_request(:get, "#{surl}/_search/scroll?scroll=10m&scroll_id=#{scroll_id}") data = Oj.load data break if data['hits']['hits'].empty? scroll_id = data['_scroll_id'] bulk = '' data['hits']['hits'].each do |doc| bulk << %Q({"#{bulk_op}": {"_index" : "#{didx}", "_id" : "#{ doc['_id']}", "_type" : "#{doc['_type']}"}}\n) bulk << Oj.dump(doc['_source']) + "\n" done += 1 end unless bulk.empty? bulk << "\n" # empty line in the end required retried_request :post, "#{durl}/_bulk", bulk end eta = total * (Time.now - t) / done printf " %u/%u (%.1f%%) done in %s, E.T.A.: %s.\r", done, total, 100.0 * done / total, tm_len(Time.now - t), t + eta end printf "#{' ' * 80}\r %u/%u done in %s.\n", done, total, tm_len(Time.now - t) tries = 0 dcount = -1 puts "Waiting for documents to appear in index..." until total <= dcount dcount = retried_request :get, "#{durl}/#{didx}/#{type}/_count" dcount = Oj.load(dcount)['count'].to_i tries += 1 if tries > 30 puts "Too many tries!" @success = false return end sleep 15 end if done != dcount puts "Incomplete done! %d != %d" % [ done, dcount ] @success = false return end @success = true end |
Instance Attribute Details
#success ⇒ Object (readonly)
Returns the value of attribute success.
11 12 13 |
# File 'lib/esteem/reindex.rb', line 11 def success @success end |