ej 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
[](http://travis-ci.org/toyama0919/ej)
|
4
|
+
[](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
|

|
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
|