ej 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +17 -0
- data/README.md +24 -10
- data/ej.gemspec +2 -2
- data/lib/ej.rb +6 -0
- data/lib/ej/cluster.rb +17 -0
- data/lib/ej/commands.rb +43 -32
- data/lib/ej/constants.rb +3 -0
- data/lib/ej/core.rb +60 -164
- data/lib/ej/indices.rb +86 -0
- data/lib/ej/nodes.rb +17 -0
- data/lib/ej/util.rb +23 -0
- data/lib/ej/values.rb +18 -0
- data/lib/ej/version.rb +1 -1
- data/spec/commands_spec.rb +1 -1
- data/spec/core_spec.rb +8 -17
- data/spec/util_spec.rb +36 -0
- metadata +20 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0e265c64a78dc3bbee03d836b6014ff02230cf5
|
4
|
+
data.tar.gz: 99a5bc9767afe77467139e167c6e29f9ba15f295
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa8937a41e19a3ef15ffc673a90625be86a59907005de7398e75e7d3f3fd80c4aa71c16ea3b6673250e697cf3b26e618e1f0bb70ae39e4ebaec50eae4fb4cf04
|
7
|
+
data.tar.gz: fa7f6f3316420ff29b4a064c23968b389cbb1b49f0b5e30ac34df9c9cd81dd0f0aac08157c3354353082769ee5e3618424dbe7d6d4f35b81ccc01eb7fd8904c6
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
-
# Ej
|
1
|
+
# Ej
|
2
|
+
|
3
|
+
[![Build Status](https://secure.travis-ci.org/toyama0919/ej.png?branch=master)](http://travis-ci.org/toyama0919/ej)
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/ej.svg)](http://badge.fury.io/rb/ej)
|
2
5
|
|
3
6
|
elasticsearch command line utility
|
4
7
|
|
5
|
-
|
8
|
+
support ruby version >= 2.1
|
6
9
|
|
7
10
|
![ej4.gif](https://qiita-image-store.s3.amazonaws.com/0/26670/116a381c-98f6-aa72-fbd9-ddc4b179b744.gif)
|
8
11
|
|
@@ -35,7 +38,7 @@ ej -s -h other_host:9201
|
|
35
38
|
|
36
39
|
### query search and index
|
37
40
|
```bash
|
38
|
-
ej -s "ip_address: 127.0.0.1" -i logstash-2014.07.01
|
41
|
+
ej -s "ip_address: 127.0.0.1" -i logstash-2014.07.01 -h other_host
|
39
42
|
```
|
40
43
|
|
41
44
|
### index list
|
@@ -45,17 +48,12 @@ ej -l -h other_host
|
|
45
48
|
|
46
49
|
### count
|
47
50
|
```bash
|
48
|
-
ej -c "log_date: 2014-01-15"
|
49
|
-
```
|
50
|
-
|
51
|
-
### facet
|
52
|
-
```bash
|
53
|
-
ej -f session_id -q "log_date: 2014-01-15"
|
51
|
+
ej -c "log_date: 2014-01-15" -h other_host
|
54
52
|
```
|
55
53
|
|
56
54
|
### mapping
|
57
55
|
```bash
|
58
|
-
ej -m
|
56
|
+
ej -m -h other_host
|
59
57
|
```
|
60
58
|
|
61
59
|
### delete index
|
@@ -63,6 +61,22 @@ ej -m
|
|
63
61
|
ej delete -i logstash-2014.07.01 -h other_host
|
64
62
|
```
|
65
63
|
|
64
|
+
### copy index from remote to remote
|
65
|
+
```bash
|
66
|
+
ej copy --source remote_host1:9200 --dest remote_host2:9200 -i logstash-2017.01.27 -q 'size: 631'
|
67
|
+
```
|
68
|
+
|
69
|
+
## monitor
|
70
|
+
|
71
|
+
### node stats
|
72
|
+
```bash
|
73
|
+
ej nodes_stats -h remote_host1
|
74
|
+
```
|
75
|
+
|
76
|
+
### settings
|
77
|
+
```bash
|
78
|
+
ej settings -h remote_host1
|
79
|
+
```
|
66
80
|
|
67
81
|
## Contributing
|
68
82
|
|
data/ej.gemspec
CHANGED
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency "bundler"
|
22
|
-
spec.add_development_dependency "rake"
|
21
|
+
spec.add_development_dependency "bundler"
|
22
|
+
spec.add_development_dependency "rake", '< 11.0'
|
23
23
|
spec.add_development_dependency "pry"
|
24
24
|
spec.add_development_dependency "pry-doc"
|
25
25
|
spec.add_development_dependency 'rspec', '~> 2.4'
|
data/lib/ej.rb
CHANGED
data/lib/ej/cluster.rb
ADDED
data/lib/ej/commands.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# coding: utf-8
|
3
1
|
require 'ej/core'
|
4
2
|
require 'thor'
|
5
3
|
require 'yajl'
|
@@ -17,13 +15,16 @@ module Ej
|
|
17
15
|
map '-l' => :indices
|
18
16
|
map '-a' => :aliases
|
19
17
|
map '-m' => :mapping
|
20
|
-
map '-e' => :debug_eval
|
21
18
|
map '--health' => :health
|
22
19
|
|
23
20
|
def initialize(args = [], options = {}, config = {})
|
24
21
|
super(args, options, config)
|
25
22
|
@global_options = config[:shell].base.options
|
26
|
-
|
23
|
+
values = Values.new(@global_options)
|
24
|
+
@core = Ej::Core.new(values)
|
25
|
+
@indices = Ej::Indices.new(values)
|
26
|
+
@cluster = Ej::Cluster.new(values)
|
27
|
+
@nodes = Ej::Nodes.new(values)
|
27
28
|
end
|
28
29
|
|
29
30
|
desc '-s [lucene query]', 'search'
|
@@ -31,7 +32,7 @@ module Ej
|
|
31
32
|
option :size, type: :numeric, aliases: '-n', default: nil, desc: 'size'
|
32
33
|
option :from, type: :numeric, aliases: '--from', default: 0, desc: 'from'
|
33
34
|
option :fields, type: :array, aliases: '--fields', default: nil, desc: 'fields'
|
34
|
-
option :
|
35
|
+
option :meta, type: :boolean, default: false, desc: 'meta'
|
35
36
|
option :query, type: :string, aliases: '-q', default: nil, desc: 'query'
|
36
37
|
option :sort, type: :hash, aliases: '--sort', default: nil, desc: 'ex. --sort @timestamp:desc'
|
37
38
|
def search(query = options[:query])
|
@@ -39,7 +40,7 @@ module Ej
|
|
39
40
|
query,
|
40
41
|
options[:size],
|
41
42
|
options[:from],
|
42
|
-
options[:
|
43
|
+
options[:meta],
|
43
44
|
nil,
|
44
45
|
options[:fields],
|
45
46
|
options[:sort]
|
@@ -65,16 +66,14 @@ module Ej
|
|
65
66
|
option :dest, type: :string, aliases: '--dest', required: true, desc: 'dest host'
|
66
67
|
option :query, type: :string, aliases: '-q', default: nil, desc: 'query'
|
67
68
|
option :per, type: :numeric, default: nil, desc: 'per'
|
68
|
-
option :
|
69
|
-
option :from, type: :numeric, default: 0, desc: 'from'
|
69
|
+
option :scroll, type: :string, default: "1m", desc: 'scroll'
|
70
70
|
def copy
|
71
71
|
@core.copy(
|
72
72
|
options[:source],
|
73
73
|
options[:dest],
|
74
74
|
options[:query],
|
75
75
|
options[:per],
|
76
|
-
options[:
|
77
|
-
options[:from]
|
76
|
+
options[:scroll]
|
78
77
|
)
|
79
78
|
end
|
80
79
|
|
@@ -112,51 +111,63 @@ module Ej
|
|
112
111
|
puts_with_format(@core.max(options[:term]))
|
113
112
|
end
|
114
113
|
|
115
|
-
desc '-b', 'bulk import
|
114
|
+
desc '-b', 'bulk import JSON'
|
116
115
|
option :index, aliases: '-i', type: :string, default: "logstash-#{Time.now.strftime('%Y.%m.%d')}", required: true, desc: 'index'
|
117
116
|
option :type, type: :string, aliases: '-t', default: nil, required: true, desc: 'type'
|
118
117
|
option :timestamp_key, aliases: '--timestamp_key', type: :string, desc: 'timestamp key', default: nil
|
119
118
|
option :add_timestamp, type: :boolean, default: true, desc: 'add_timestamp'
|
120
119
|
option :id_keys, type: :array, aliases: '--id', default: nil, desc: 'id'
|
120
|
+
option :inputs, type: :array, aliases: '--inputs', default: [], desc: 'input files path.'
|
121
121
|
def bulk
|
122
|
-
|
122
|
+
inputs = options[:inputs].empty? ? [STDIN] : options[:inputs]
|
123
|
+
inputs.each do |key|
|
124
|
+
buffer = (key.class == STDIN.class) ? STDIN.read : File.read(key)
|
125
|
+
@core.bulk(
|
126
|
+
options[:timestamp_key],
|
127
|
+
options[:type],
|
128
|
+
options[:add_timestamp],
|
129
|
+
options[:id_keys],
|
130
|
+
options[:index],
|
131
|
+
Util.parse_json(buffer)
|
132
|
+
)
|
133
|
+
end
|
123
134
|
end
|
124
135
|
|
125
136
|
desc 'health', 'health'
|
126
137
|
def health
|
127
|
-
puts_with_format(@
|
138
|
+
puts_with_format(@cluster.health)
|
128
139
|
end
|
129
140
|
|
130
141
|
desc '-a', 'list aliases'
|
131
142
|
def aliases
|
132
|
-
puts_with_format(@
|
143
|
+
puts_with_format(@indices.aliases)
|
133
144
|
end
|
134
145
|
|
135
146
|
desc 'state', 'state'
|
136
147
|
def state
|
137
|
-
puts_with_format(@
|
148
|
+
puts_with_format(@cluster.state)
|
138
149
|
end
|
139
150
|
|
140
151
|
desc 'indices', 'show indices summary'
|
141
152
|
def indices
|
142
|
-
puts_with_format(@
|
153
|
+
puts_with_format(@indices.indices)
|
143
154
|
end
|
144
155
|
|
145
156
|
desc 'stats', 'index stats'
|
146
157
|
def stats
|
147
|
-
puts_with_format(@
|
158
|
+
puts_with_format(@indices.stats)
|
148
159
|
end
|
149
160
|
|
150
161
|
desc 'mapping', 'show mapping'
|
151
162
|
def mapping
|
152
|
-
puts_with_format(@
|
163
|
+
puts_with_format(@indices.mapping)
|
153
164
|
end
|
154
165
|
|
155
166
|
desc 'not_analyzed', 'not analyzed'
|
156
167
|
def not_analyzed
|
157
168
|
json = File.read(File.expand_path('../../../template/not_analyze_template.json', __FILE__))
|
158
169
|
hash = Yajl::Parser.parse(json)
|
159
|
-
puts_with_format(@
|
170
|
+
puts_with_format(@indices.put_template('ej_init', hash))
|
160
171
|
end
|
161
172
|
|
162
173
|
desc 'put_routing', "put routing.\nexsample. ej put_routing -i someindex -t sometype --path somecolumn"
|
@@ -165,69 +176,69 @@ module Ej
|
|
165
176
|
option :path, type: :string, default: nil, required: true, desc: 'path'
|
166
177
|
def put_routing
|
167
178
|
body = { options[:type] => {"_routing"=>{"required"=>true, "path"=>options[:path]}}}
|
168
|
-
puts_with_format(@
|
179
|
+
puts_with_format(@indices.put_mapping(options[:index], options[:type], body))
|
169
180
|
end
|
170
181
|
|
171
182
|
desc 'put_template', 'put template'
|
172
183
|
def put_template(name)
|
173
184
|
hash = Yajl::Parser.parse(STDIN.read)
|
174
|
-
puts_with_format(@
|
185
|
+
puts_with_format(@indices.put_template(name, hash))
|
175
186
|
end
|
176
187
|
|
177
188
|
desc 'create_aliases', 'create aliases'
|
178
189
|
option :alias, type: :string, aliases: '-a', default: nil, required: true, desc: 'alias name'
|
179
190
|
option :indices, type: :array, aliases: '-x', default: nil, required: true, desc: 'index array'
|
180
191
|
def create_aliases
|
181
|
-
@
|
192
|
+
@indices.create_aliases(options[:alias], options[:indices])
|
182
193
|
end
|
183
194
|
|
184
195
|
desc 'recovery', 'recovery'
|
185
196
|
def recovery
|
186
|
-
@
|
197
|
+
@indices.recovery
|
187
198
|
end
|
188
199
|
|
189
200
|
desc 'delete', 'delete'
|
190
201
|
option :index, aliases: '-i', type: :string, default: nil, required: true, desc: 'index'
|
191
202
|
option :type, type: :string, aliases: '-t', default: nil, desc: 'type'
|
192
|
-
option :query, type: :
|
203
|
+
option :query, type: :hash, aliases: '-q', default: nil, desc: 'query'
|
193
204
|
def delete
|
194
|
-
@
|
205
|
+
@indices.delete(options[:index], options[:type], options[:query])
|
195
206
|
end
|
196
207
|
|
197
208
|
desc 'delete_template --name [name]', 'delete_template'
|
198
209
|
option :name, type: :string, default: nil, required: true, desc: 'template name'
|
199
210
|
def delete_template
|
200
|
-
@
|
211
|
+
@indices.delete_template(options[:name])
|
201
212
|
end
|
202
213
|
|
203
214
|
desc 'template', 'show template'
|
204
215
|
def template
|
205
|
-
puts_with_format(@
|
216
|
+
puts_with_format(@indices.template)
|
206
217
|
end
|
207
218
|
|
208
219
|
desc 'settings', 'show template'
|
209
220
|
def settings
|
210
|
-
puts_with_format(@
|
221
|
+
puts_with_format(@indices.settings)
|
211
222
|
end
|
212
223
|
|
213
224
|
desc 'warmer', 'warmer'
|
214
225
|
def warmer
|
215
|
-
puts_with_format(@
|
226
|
+
puts_with_format(@indices.warmer)
|
216
227
|
end
|
217
228
|
|
218
229
|
desc 'refresh', 'refresh'
|
219
230
|
def refresh
|
220
|
-
puts_with_format(@
|
231
|
+
puts_with_format(@indices.refresh)
|
221
232
|
end
|
222
233
|
|
223
234
|
desc 'nodes_info', 'view nodes info'
|
224
235
|
def nodes_info
|
225
|
-
puts_with_format @
|
236
|
+
puts_with_format @nodes.nodes_info
|
226
237
|
end
|
227
238
|
|
228
239
|
desc 'nodes_stats', 'view nodes stats'
|
229
240
|
def nodes_stats
|
230
|
-
puts_with_format @
|
241
|
+
puts_with_format @nodes.nodes_stats
|
231
242
|
end
|
232
243
|
|
233
244
|
private
|
data/lib/ej/constants.rb
ADDED
data/lib/ej/core.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# coding: utf-8
|
3
1
|
require 'yajl'
|
4
2
|
require 'elasticsearch'
|
5
3
|
require 'hashie'
|
@@ -12,16 +10,13 @@ end
|
|
12
10
|
|
13
11
|
module Ej
|
14
12
|
class Core
|
15
|
-
|
16
|
-
|
17
|
-
@
|
18
|
-
@
|
19
|
-
|
20
|
-
@index = index
|
21
|
-
@client = Elasticsearch::Client.new hosts: host, logger: @logger, index: @index
|
13
|
+
def initialize(values)
|
14
|
+
@logger = values.logger
|
15
|
+
@index = values.index
|
16
|
+
@client = values.client
|
22
17
|
end
|
23
18
|
|
24
|
-
def search(type, query, size, from,
|
19
|
+
def search(type, query, size, from, meta, routing = nil, fields = nil, sort = nil)
|
25
20
|
body = { from: from }
|
26
21
|
body[:size] = size unless size.nil?
|
27
22
|
if sort
|
@@ -36,7 +31,7 @@ module Ej
|
|
36
31
|
search_option[:routing] = routing unless routing.nil?
|
37
32
|
search_option[:_source] = fields.nil? ? nil : fields.join(',')
|
38
33
|
results = HashWrapper.new(@client.search(search_option))
|
39
|
-
|
34
|
+
meta ? results : Util.get_sources(results)
|
40
35
|
end
|
41
36
|
|
42
37
|
def distinct(term, type, query)
|
@@ -45,42 +40,6 @@ module Ej
|
|
45
40
|
@client.search index: @index, type: type, body: body
|
46
41
|
end
|
47
42
|
|
48
|
-
def copy(source, dest, query, per_size, proc_num, define_from = 0)
|
49
|
-
per = per_size || DEFAULT_PER
|
50
|
-
logger = Logger.new($stdout)
|
51
|
-
source_client = Elasticsearch::Client.new hosts: source, index: @index
|
52
|
-
dest_client = Elasticsearch::Client.new hosts: dest
|
53
|
-
calculate_body = { size: 0 }
|
54
|
-
calculate_body[:query] = { query_string: { query: query } } unless query.nil?
|
55
|
-
calculate_data = HashWrapper.new(source_client.search index: @index, body: calculate_body)
|
56
|
-
total = calculate_data.hits.total
|
57
|
-
payloads = ((total/per) + 1).times.to_a
|
58
|
-
Parallel.map(payloads, in_processes: proc_num) do |num|
|
59
|
-
from = num * per
|
60
|
-
if from < define_from
|
61
|
-
logger.info("skip index (#{num} #{from}-#{from + per})/#{total}")
|
62
|
-
next
|
63
|
-
end
|
64
|
-
body = { size: per, from: from }
|
65
|
-
body[:query] = { query_string: { query: query } } unless query.nil?
|
66
|
-
data = HashWrapper.new(source_client.search index: @index, body: body)
|
67
|
-
docs = data.hits.hits
|
68
|
-
bulk_message = []
|
69
|
-
docs.each do |doc|
|
70
|
-
source = doc.delete('_source')
|
71
|
-
doc.delete('_score')
|
72
|
-
['_id', '_type', '_index'].each do |meta_field|
|
73
|
-
source.delete(meta_field)
|
74
|
-
end
|
75
|
-
bulk_message << { index: doc.to_h }
|
76
|
-
bulk_message << source
|
77
|
-
end
|
78
|
-
send_with_retry(dest_client, bulk_message)
|
79
|
-
|
80
|
-
logger.info("copy complete (#{num} #{from}-#{from + docs.size})/#{total}")
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
43
|
def dump(query, per_size)
|
85
44
|
per = per_size || DEFAULT_PER
|
86
45
|
num = 0
|
@@ -170,151 +129,88 @@ module Ej
|
|
170
129
|
@client.search index: @index, body: body, size: 0
|
171
130
|
end
|
172
131
|
|
173
|
-
def
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
end
|
180
|
-
|
181
|
-
def state
|
182
|
-
@client.cluster.state
|
183
|
-
end
|
184
|
-
|
185
|
-
def indices
|
186
|
-
@client.cat.indices format: 'json'
|
187
|
-
end
|
188
|
-
|
189
|
-
def stats
|
190
|
-
@client.indices.stats index: @index
|
191
|
-
end
|
192
|
-
|
193
|
-
def put_mapping(index, type, body)
|
194
|
-
@client.indices.create index: index unless @client.indices.exists index: index
|
195
|
-
@client.indices.put_mapping index: index, type: type, body: body
|
196
|
-
end
|
197
|
-
|
198
|
-
def mapping
|
199
|
-
data = @client.indices.get_mapping index: @index
|
200
|
-
@index == '_all' ? data : data[@index]['mappings']
|
201
|
-
end
|
202
|
-
|
203
|
-
def put_template(name, hash)
|
204
|
-
@client.indices.put_template name: name, body: hash
|
205
|
-
end
|
206
|
-
|
207
|
-
def create_aliases(als, indices)
|
208
|
-
actions = []
|
209
|
-
indices.each do |index|
|
210
|
-
actions << { add: { index: index, alias: als } }
|
211
|
-
end
|
212
|
-
@client.indices.update_aliases body: {
|
213
|
-
actions: actions
|
214
|
-
}
|
215
|
-
end
|
216
|
-
|
217
|
-
def recovery
|
218
|
-
@client.indices.recovery index: @index
|
219
|
-
end
|
220
|
-
|
221
|
-
def delete(index, type, query)
|
222
|
-
if query.nil?
|
223
|
-
if type.nil?
|
224
|
-
@client.indices.delete index: index
|
132
|
+
def bulk(timestamp_key, type, add_timestamp, id_keys, index, data)
|
133
|
+
template = id_keys.map { |key| '%s' }.join('_') unless id_keys.nil?
|
134
|
+
bulk_message = []
|
135
|
+
data.each do |record|
|
136
|
+
if timestamp_key.nil?
|
137
|
+
timestamp = Time.now.to_datetime.to_s
|
225
138
|
else
|
226
|
-
|
139
|
+
timestamp = record[timestamp_key].to_time.to_datetime.to_s
|
227
140
|
end
|
228
|
-
|
229
|
-
|
141
|
+
record.merge!('@timestamp' => timestamp) if add_timestamp
|
142
|
+
meta = { index: { _index: index, _type: type } }
|
143
|
+
meta[:index][:_id] = Util.generate_id(template, record, id_keys) unless id_keys.nil?
|
144
|
+
bulk_message << meta
|
145
|
+
bulk_message << record
|
230
146
|
end
|
147
|
+
connect_with_retry { @client.bulk body: bulk_message unless bulk_message.empty? }
|
231
148
|
end
|
232
149
|
|
233
|
-
def
|
234
|
-
|
235
|
-
|
150
|
+
def copy(source, dest, query, per_size, scroll)
|
151
|
+
source_client = Elasticsearch::Client.new hosts: source
|
152
|
+
dest_client = Elasticsearch::Client.new hosts: dest
|
236
153
|
|
237
|
-
|
238
|
-
|
239
|
-
|
154
|
+
scroll_option = get_scroll_option(@index, query, per_size, scroll)
|
155
|
+
r = connect_with_retry { source_client.search(scroll_option) }
|
156
|
+
total = r['hits']['total']
|
157
|
+
i = 0
|
158
|
+
i += bulk_results(r, dest_client, i, total)
|
240
159
|
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
def warmer
|
246
|
-
@client.indices.get_warmer index: @index
|
160
|
+
while r = connect_with_retry { source_client.scroll(scroll_id: r['_scroll_id'], scroll: scroll) } and
|
161
|
+
(not r['hits']['hits'].empty?) do
|
162
|
+
i += bulk_results(r, dest_client, i, total)
|
163
|
+
end
|
247
164
|
end
|
248
165
|
|
249
|
-
|
250
|
-
@client.indices.refresh index: @index
|
251
|
-
end
|
166
|
+
private
|
252
167
|
|
253
|
-
def
|
254
|
-
|
168
|
+
def bulk_results(results, dest_client, before_size, total)
|
169
|
+
bulk_message = convert_results(results)
|
170
|
+
connect_with_retry do
|
171
|
+
dest_client.bulk body: bulk_message unless bulk_message.empty?
|
172
|
+
to_size = before_size + (bulk_message.size/2)
|
173
|
+
@logger.info "copy complete (#{before_size}-#{to_size})/#{total}"
|
174
|
+
end
|
175
|
+
return (bulk_message.size/2)
|
255
176
|
end
|
256
177
|
|
257
|
-
def
|
258
|
-
|
178
|
+
def get_scroll_option(index, query, size, scroll)
|
179
|
+
body = {}
|
180
|
+
body[:query] = { query_string: { query: query } } unless query.nil?
|
181
|
+
search_option = { index: index, scroll: scroll, body: body, size: (size || DEFAULT_PER) }
|
182
|
+
search_option
|
259
183
|
end
|
260
184
|
|
261
|
-
def
|
262
|
-
data =
|
263
|
-
|
185
|
+
def convert_results(search_results)
|
186
|
+
data = HashWrapper.new(search_results)
|
187
|
+
docs = data.hits.hits
|
264
188
|
bulk_message = []
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
189
|
+
docs.each do |doc|
|
190
|
+
source = doc.delete('_source')
|
191
|
+
doc.delete('_score')
|
192
|
+
['_id', '_type', '_index'].each do |meta_field|
|
193
|
+
source.delete(meta_field)
|
270
194
|
end
|
271
|
-
|
272
|
-
|
273
|
-
meta[:index][:_id] = generate_id(template, record, id_keys) unless id_keys.nil?
|
274
|
-
bulk_message << meta
|
275
|
-
bulk_message << record
|
276
|
-
end
|
277
|
-
bulk_message.each_slice(10000).each do |block|
|
278
|
-
send_with_retry(@client, block)
|
195
|
+
bulk_message << { index: doc.to_h }
|
196
|
+
bulk_message << source
|
279
197
|
end
|
198
|
+
bulk_message
|
280
199
|
end
|
281
200
|
|
282
|
-
|
283
|
-
|
284
|
-
def send_with_retry(client, bulk_message, retry_on_failure = 5)
|
201
|
+
def connect_with_retry(retry_on_failure = 5)
|
285
202
|
retries = 0
|
286
203
|
begin
|
287
|
-
|
204
|
+
yield if block_given?
|
288
205
|
rescue => e
|
289
206
|
if retries < retry_on_failure
|
290
207
|
retries += 1
|
291
|
-
@logger.warn "Could not
|
208
|
+
@logger.warn "Could not connect to Elasticsearch, resetting connection and trying again. #{e.message}"
|
292
209
|
sleep 2**retries
|
293
210
|
retry
|
294
211
|
end
|
295
|
-
raise "Could not
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
def parse_json(buffer)
|
300
|
-
begin
|
301
|
-
data = Yajl::Parser.parse(buffer)
|
302
|
-
rescue => e
|
303
|
-
data = []
|
304
|
-
buffer.split("\n").each do |line|
|
305
|
-
data << Yajl::Parser.parse(line)
|
306
|
-
end
|
212
|
+
raise "Could not connect to Elasticsearch after #{retries} retries. #{e.message}"
|
307
213
|
end
|
308
|
-
data.class == Array ? data : [data]
|
309
214
|
end
|
310
|
-
|
311
|
-
def generate_id(template, record, id_keys)
|
312
|
-
template % id_keys.map { |key| record[key] }
|
313
|
-
end
|
314
|
-
|
315
|
-
def get_sources(results)
|
316
|
-
results.hits.hits.map { |result| result._source }
|
317
|
-
end
|
318
|
-
|
319
215
|
end
|
320
216
|
end
|
data/lib/ej/indices.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
module Ej
|
2
|
+
class Indices
|
3
|
+
def initialize(values)
|
4
|
+
@logger = values.logger
|
5
|
+
@index = values.index
|
6
|
+
@client = values.client
|
7
|
+
end
|
8
|
+
|
9
|
+
def aliases
|
10
|
+
@client.indices.get_aliases
|
11
|
+
end
|
12
|
+
|
13
|
+
def indices
|
14
|
+
@client.cat.indices format: 'json'
|
15
|
+
end
|
16
|
+
|
17
|
+
def stats
|
18
|
+
@client.indices.stats index: @index
|
19
|
+
end
|
20
|
+
|
21
|
+
def put_template(name, hash)
|
22
|
+
@client.indices.put_template name: name, body: hash
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_aliases(als, indices)
|
26
|
+
actions = []
|
27
|
+
indices.each do |index|
|
28
|
+
actions << { add: { index: index, alias: als } }
|
29
|
+
end
|
30
|
+
@client.indices.update_aliases body: {
|
31
|
+
actions: actions
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def recovery
|
36
|
+
@client.indices.recovery index: @index
|
37
|
+
end
|
38
|
+
|
39
|
+
def put_mapping(index, type, body)
|
40
|
+
@client.indices.create index: index unless @client.indices.exists index: index
|
41
|
+
@client.indices.put_mapping index: index, type: type, body: body
|
42
|
+
end
|
43
|
+
|
44
|
+
def mapping
|
45
|
+
data = @client.indices.get_mapping index: @index
|
46
|
+
@index == '_all' ? data : data[@index]['mappings']
|
47
|
+
end
|
48
|
+
|
49
|
+
def delete(index, type, query)
|
50
|
+
if query.nil?
|
51
|
+
if type.nil?
|
52
|
+
@client.indices.delete index: index
|
53
|
+
else
|
54
|
+
@client.delete_by_query index: index, type: type, q: '*'
|
55
|
+
end
|
56
|
+
else
|
57
|
+
body = {
|
58
|
+
query: {
|
59
|
+
match: query
|
60
|
+
}
|
61
|
+
}
|
62
|
+
@client.delete_by_query index: index, body: body
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def template
|
67
|
+
@client.indices.get_template
|
68
|
+
end
|
69
|
+
|
70
|
+
def delete_template(name)
|
71
|
+
@client.indices.delete_template name: name
|
72
|
+
end
|
73
|
+
|
74
|
+
def settings
|
75
|
+
@client.indices.get_settings
|
76
|
+
end
|
77
|
+
|
78
|
+
def warmer
|
79
|
+
@client.indices.get_warmer index: @index
|
80
|
+
end
|
81
|
+
|
82
|
+
def refresh
|
83
|
+
@client.indices.refresh index: @index
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/ej/nodes.rb
ADDED
data/lib/ej/util.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Ej
|
2
|
+
class Util
|
3
|
+
def self.parse_json(buffer)
|
4
|
+
begin
|
5
|
+
data = Yajl::Parser.parse(buffer)
|
6
|
+
rescue => e
|
7
|
+
data = []
|
8
|
+
buffer.lines.each do |line|
|
9
|
+
data << Yajl::Parser.parse(line)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
data.class == Array ? data : [data]
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.generate_id(template, record, id_keys)
|
16
|
+
template % id_keys.map { |key| record[key] }
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.get_sources(results)
|
20
|
+
results.hits.hits.map { |result| result._source }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/ej/values.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Ej
|
2
|
+
class Values
|
3
|
+
attr_reader :client
|
4
|
+
attr_reader :index
|
5
|
+
attr_reader :logger
|
6
|
+
|
7
|
+
def initialize(global_options)
|
8
|
+
@logger = Logger.new($stderr)
|
9
|
+
@logger.level = global_options[:debug] ? Logger::DEBUG : Logger::INFO
|
10
|
+
@client = Elasticsearch::Client.new(
|
11
|
+
hosts: global_options[:host],
|
12
|
+
logger: @logger,
|
13
|
+
index: global_options[:index]
|
14
|
+
)
|
15
|
+
@index = global_options[:index]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/ej/version.rb
CHANGED
data/spec/commands_spec.rb
CHANGED
data/spec/core_spec.rb
CHANGED
@@ -3,29 +3,20 @@ require 'ej'
|
|
3
3
|
|
4
4
|
describe Ej::Core do
|
5
5
|
before do
|
6
|
-
|
6
|
+
values = Values.new(
|
7
|
+
{
|
8
|
+
index: '_all',
|
9
|
+
host: 'localhost',
|
10
|
+
debug: false
|
11
|
+
}
|
12
|
+
)
|
13
|
+
@core = Core.new(values)
|
7
14
|
end
|
8
15
|
|
9
16
|
it "core not nil" do
|
10
17
|
@core.should_not nil
|
11
18
|
end
|
12
19
|
|
13
|
-
it "parse json" do
|
14
|
-
@core.send(:parse_json, '{"id":1, "name":"rspec"}').should == [{"id" => 1, "name" => "rspec"}]
|
15
|
-
end
|
16
|
-
|
17
|
-
it "parse json" do
|
18
|
-
json = %[{"id":1, "name":"rspec"}
|
19
|
-
{"id":1, "name":"rspec"}
|
20
|
-
{"id":1, "name":"rspec"}
|
21
|
-
{"id":1, "name":"rspec"}]
|
22
|
-
@core.send(:parse_json, json).should == [{"id" => 1, "name" => "rspec"}, {"id" => 1, "name" => "rspec"}, {"id" => 1, "name" => "rspec"}, {"id" => 1, "name" => "rspec"}]
|
23
|
-
end
|
24
|
-
|
25
|
-
it "generate id" do
|
26
|
-
@core.send(:generate_id, '%s_%s', {"id" => 1, "name" => "rspec"}, ['id', 'name']).should == '1_rspec'
|
27
|
-
end
|
28
|
-
|
29
20
|
after do
|
30
21
|
end
|
31
22
|
end
|
data/spec/util_spec.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ej'
|
3
|
+
|
4
|
+
describe Ej::Util do
|
5
|
+
before do
|
6
|
+
end
|
7
|
+
|
8
|
+
it "parse json" do
|
9
|
+
Util.parse_json('{"id":1, "name":"rspec"}').should == [{"id" => 1, "name" => "rspec"}]
|
10
|
+
end
|
11
|
+
|
12
|
+
it "parse jsonl" do
|
13
|
+
json = %[{"id":1, "name":"rspec"}
|
14
|
+
{"id":1, "name":"rspec"}
|
15
|
+
{"id":1, "name":"rspec"}
|
16
|
+
{"id":1, "name":"rspec"}]
|
17
|
+
Util.parse_json(json).should == [{"id" => 1, "name" => "rspec"}, {"id" => 1, "name" => "rspec"}, {"id" => 1, "name" => "rspec"}, {"id" => 1, "name" => "rspec"}]
|
18
|
+
end
|
19
|
+
|
20
|
+
it "parse json array" do
|
21
|
+
json = %[[
|
22
|
+
{"id":1, "name":"rspec"},
|
23
|
+
{"id":2, "name":"rspec"},
|
24
|
+
{"id":3, "name":"rspec"},
|
25
|
+
{"id":4, "name":"rspec"}
|
26
|
+
]]
|
27
|
+
Util.parse_json(json).should == [{"id" => 1, "name" => "rspec"}, {"id" => 2, "name" => "rspec"}, {"id" => 3, "name" => "rspec"}, {"id" => 4, "name" => "rspec"}]
|
28
|
+
end
|
29
|
+
|
30
|
+
it "generate id" do
|
31
|
+
Util.generate_id('%s_%s', {"id" => 1, "name" => "rspec"}, ['id', 'name']).should == '1_rspec'
|
32
|
+
end
|
33
|
+
|
34
|
+
after do
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ej
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- toyama0919
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "<"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '11.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "<"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
40
|
+
version: '11.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -160,6 +160,7 @@ extra_rdoc_files: []
|
|
160
160
|
files:
|
161
161
|
- ".gitignore"
|
162
162
|
- ".pryrc"
|
163
|
+
- ".travis.yml"
|
163
164
|
- Gemfile
|
164
165
|
- LICENSE.txt
|
165
166
|
- README.md
|
@@ -167,13 +168,20 @@ files:
|
|
167
168
|
- bin/ej
|
168
169
|
- ej.gemspec
|
169
170
|
- lib/ej.rb
|
171
|
+
- lib/ej/cluster.rb
|
170
172
|
- lib/ej/commands.rb
|
173
|
+
- lib/ej/constants.rb
|
171
174
|
- lib/ej/core.rb
|
175
|
+
- lib/ej/indices.rb
|
176
|
+
- lib/ej/nodes.rb
|
177
|
+
- lib/ej/util.rb
|
178
|
+
- lib/ej/values.rb
|
172
179
|
- lib/ej/version.rb
|
173
180
|
- spec/commands_spec.rb
|
174
181
|
- spec/core_spec.rb
|
175
182
|
- spec/ej_spec.rb
|
176
183
|
- spec/spec_helper.rb
|
184
|
+
- spec/util_spec.rb
|
177
185
|
- template/ejrc.erb
|
178
186
|
- template/not_analyze_template.json
|
179
187
|
homepage: https://github.com/toyama0919/ej
|
@@ -196,7 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
196
204
|
version: '0'
|
197
205
|
requirements: []
|
198
206
|
rubyforge_project:
|
199
|
-
rubygems_version: 2.
|
207
|
+
rubygems_version: 2.6.11
|
200
208
|
signing_key:
|
201
209
|
specification_version: 4
|
202
210
|
summary: elasticsearch command line utility.
|
@@ -205,4 +213,4 @@ test_files:
|
|
205
213
|
- spec/core_spec.rb
|
206
214
|
- spec/ej_spec.rb
|
207
215
|
- spec/spec_helper.rb
|
208
|
-
|
216
|
+
- spec/util_spec.rb
|