elastics-client 1.1.11 → 1.2.0
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 +7 -0
- data/VERSION +1 -1
- data/elastics-client.gemspec +6 -3
- data/lib/elastics-client.rb +40 -7
- data/lib/elastics/api_stubs.rb +613 -546
- data/lib/elastics/api_templates/cat_api.yml +14 -0
- data/lib/elastics/api_templates/cluster_api.yml +91 -39
- data/lib/elastics/api_templates/document_api.yml +154 -0
- data/lib/elastics/api_templates/elastics_additions.yml +32 -0
- data/lib/elastics/api_templates/indices_api.yml +313 -148
- data/lib/elastics/api_templates/search_api.yml +144 -0
- data/lib/elastics/class_proxy/base.rb +4 -2
- data/lib/elastics/class_proxy/templates.rb +14 -9
- data/lib/elastics/class_proxy/templates/doc.rb +138 -69
- data/lib/elastics/class_proxy/templates/search.rb +14 -17
- data/lib/elastics/client_live_reindex.rb +2 -2
- data/lib/elastics/configuration.rb +1 -1
- data/lib/elastics/errors.rb +10 -9
- data/lib/elastics/result/bulk.rb +2 -3
- data/lib/elastics/result/search.rb +5 -0
- data/lib/elastics/struct/symbolize.rb +2 -2
- data/lib/elastics/template.rb +9 -7
- data/lib/elastics/template/api.rb +15 -0
- data/lib/elastics/template/slim_search.rb +2 -2
- data/lib/elastics/template/tags.rb +1 -1
- data/lib/elastics/utility_methods.rb +12 -4
- data/lib/elastics/utils.rb +14 -4
- data/lib/elastics/variables.rb +1 -1
- metadata +37 -38
- data/lib/elastics/api_templates/core_api.yml +0 -206
@@ -0,0 +1,144 @@
|
|
1
|
+
# These methods are available as Elastics.<method>(*vars)
|
2
|
+
# you can get the updated full reference and usage example of these methods
|
3
|
+
# by just doing in the console:
|
4
|
+
# Elastics.doc
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
#-----------------------------------------------------------------------------#
|
9
|
+
### Search ###
|
10
|
+
# The search api is covered by the templating system
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
#-----------------------------------------------------------------------------#
|
15
|
+
### Search Shards ###
|
16
|
+
|
17
|
+
search_shards:
|
18
|
+
- GET
|
19
|
+
- /<<index>>/<<type>>/_search_shards
|
20
|
+
-
|
21
|
+
- REFERENCES:
|
22
|
+
group: search_api
|
23
|
+
api_name: Search Shards
|
24
|
+
api_url: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-shards.html
|
25
|
+
notice: "You can pass the parameters as the :params variable."
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
#-----------------------------------------------------------------------------#
|
30
|
+
### Multi Search ###
|
31
|
+
# the Multi Search api is covered by the <YourClass>.multi_search method
|
32
|
+
# added by the Elastics::Templates module
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
#-----------------------------------------------------------------------------#
|
37
|
+
### Count ###
|
38
|
+
|
39
|
+
count:
|
40
|
+
- GET
|
41
|
+
- /<<index>>/<<type>>/_count
|
42
|
+
-
|
43
|
+
- REFERENCES:
|
44
|
+
group: search_api
|
45
|
+
api_name: Search Shards
|
46
|
+
api_url: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-count.html
|
47
|
+
notice: "You must pass the query to validate as the :data variable. You can pass the parameters as the :params variable."
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
#-----------------------------------------------------------------------------#
|
52
|
+
### Search Exists ###
|
53
|
+
|
54
|
+
search_exists:
|
55
|
+
- GET
|
56
|
+
- /<<index>>/<<type>>/<<id= ~ >>/_search/exists
|
57
|
+
-
|
58
|
+
- REFERENCES:
|
59
|
+
group: search_api
|
60
|
+
api_name: Search Exists
|
61
|
+
api_url: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-exists.html
|
62
|
+
notice: "You must pass the query to validate as the :data variable. You can pass the parameters as the :params variable."
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
#-----------------------------------------------------------------------------#
|
67
|
+
### Validate ###
|
68
|
+
|
69
|
+
validate:
|
70
|
+
- GET
|
71
|
+
- /<<index>>/<<type>>/<<id= ~ >>/_validate/query
|
72
|
+
-
|
73
|
+
- REFERENCES:
|
74
|
+
group: search_api
|
75
|
+
api_name: Validate
|
76
|
+
api_url: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-validate.html
|
77
|
+
notice: "You must pass the query to validate as the :data variable. You can pass the parameters as the :params variable."
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
#-----------------------------------------------------------------------------#
|
82
|
+
### Explain ###
|
83
|
+
|
84
|
+
explain:
|
85
|
+
- GET
|
86
|
+
- /<<index>>/<<type>>/<<id= ~ >>/_explain
|
87
|
+
-
|
88
|
+
- REFERENCES:
|
89
|
+
group: search_api
|
90
|
+
api_name: Validate
|
91
|
+
api_url: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html
|
92
|
+
notice: "You must pass the query to explain as the :data variable. You can pass the parameters as the :params variable."
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
#-----------------------------------------------------------------------------#
|
97
|
+
### Percolator ###
|
98
|
+
|
99
|
+
delete_percolator:
|
100
|
+
- DELETE
|
101
|
+
- /<<index>>/.percolator/<<id>>
|
102
|
+
-
|
103
|
+
- REFERENCES: &percolator
|
104
|
+
group: search_api
|
105
|
+
api_name: Percolator
|
106
|
+
api_url: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-percolate.html
|
107
|
+
|
108
|
+
percolate:
|
109
|
+
- GET
|
110
|
+
- /<<index>>/<<type>>/_percolate
|
111
|
+
-
|
112
|
+
- &percolator_ref
|
113
|
+
REFERENCES:
|
114
|
+
<<: *percolator
|
115
|
+
notice: "You must pass the the document (and additional queries) as :data variable."
|
116
|
+
|
117
|
+
percolate_count:
|
118
|
+
- GET
|
119
|
+
- /<<index>>/<<type>>/_percolate/count
|
120
|
+
-
|
121
|
+
- *percolator_ref
|
122
|
+
|
123
|
+
put_percolator:
|
124
|
+
- PUT
|
125
|
+
- /<<index>>/.percolator/<<id>>
|
126
|
+
-
|
127
|
+
- *percolator_ref
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
#-----------------------------------------------------------------------------#
|
132
|
+
### More Like This ###
|
133
|
+
|
134
|
+
more_like_this:
|
135
|
+
- GET
|
136
|
+
- /<<index>>/<<type>>/<<id>>/_mlt
|
137
|
+
-
|
138
|
+
- REFERENCES:
|
139
|
+
group: search_api
|
140
|
+
api_name: More Like This
|
141
|
+
api_url: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-more-like-this.html
|
142
|
+
notice: "You can pass the search API as :data variable."
|
143
|
+
aliases:
|
144
|
+
- :mlt
|
@@ -5,8 +5,10 @@ module Elastics
|
|
5
5
|
attr_accessor :variables
|
6
6
|
|
7
7
|
def initialize(context, vars={})
|
8
|
-
|
9
|
-
|
8
|
+
v = {:context => context}
|
9
|
+
# support for elastics-rails index default
|
10
|
+
v[:index] = Conf.variables[:index] if Conf.variables.has_key?(:index)
|
11
|
+
@variables = Vars.new(v, vars)
|
10
12
|
end
|
11
13
|
|
12
14
|
def init; end
|
@@ -15,19 +15,24 @@ module Elastics
|
|
15
15
|
# accepts a path to a file or YAML string
|
16
16
|
def load_source_for(klass, source, source_vars)
|
17
17
|
if source.nil? || source !~ /\n/m
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
source
|
18
|
+
base_names = [source, Utils.class_name_to_path(context.name), Utils.class_name_to_type(context.name)]
|
19
|
+
paths = base_names.map{|bn| ["#{Conf.elastics_dir}/#{bn}.yml", "#{Conf.elastics_dir}/#{bn}.yml.erb"]}.flatten
|
20
|
+
paths << source.to_s
|
21
|
+
source = paths.find {|p| File.exist?(p)}
|
22
22
|
end
|
23
|
-
raise ArgumentError, "expected a string, got #{source.inspect}" \
|
24
|
-
|
23
|
+
raise ArgumentError, "Unable to load the source: expected a string, got #{source.inspect}" \
|
24
|
+
unless source.is_a?(String)
|
25
25
|
@sources << [klass, source, source_vars]
|
26
26
|
do_load_source(klass, source, source_vars)
|
27
27
|
# fixes the legacy empty stubs, which should call super instead
|
28
|
-
@templates.keys.each do |name|
|
29
|
-
|
30
|
-
end
|
28
|
+
# @templates.keys.each do |name|
|
29
|
+
# meta_context.send(:define_method, name){|*vars| super *vars }
|
30
|
+
# end
|
31
|
+
end
|
32
|
+
|
33
|
+
# loads a API Template source
|
34
|
+
def load_api_source(source=nil, source_vars=nil)
|
35
|
+
load_source_for(Elastics::Template::Api, source, source_vars)
|
31
36
|
end
|
32
37
|
|
33
38
|
# loads a Generic Template source
|
@@ -3,86 +3,155 @@ module Elastics
|
|
3
3
|
module Templates
|
4
4
|
module Doc
|
5
5
|
|
6
|
+
class Output
|
7
|
+
|
8
|
+
|
9
|
+
attr_reader :template, :method_call
|
10
|
+
|
11
|
+
def initialize(name, proxy)
|
12
|
+
@name, @template = proxy.templates.find do |n, t|
|
13
|
+
t.is_a?(Elastics::Template::Api) && t.aliases.include?(name)
|
14
|
+
end || [ name, proxy.templates[name]]
|
15
|
+
@method_call = [proxy.context, @name].join('.')
|
16
|
+
|
17
|
+
sources = []
|
18
|
+
sources << { :class => @template.class,
|
19
|
+
:source => @template.to_source }
|
20
|
+
@template.partials.each do |name|
|
21
|
+
partial = proxy.partials[name]
|
22
|
+
sources << { :class => partial.class,
|
23
|
+
:source => partial.to_source }
|
24
|
+
end
|
25
|
+
@sources = sources
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def render_usage(indent='')
|
30
|
+
variables = @template.instance_eval do
|
31
|
+
interpolate
|
32
|
+
@base_variables.deep_merge @host_elastics && @host_elastics.variables, @temp_variables
|
33
|
+
end
|
34
|
+
all_tags = @template.tags + @template.partials
|
35
|
+
return @method_call if all_tags.size == 0
|
36
|
+
lines = all_tags.map do |t|
|
37
|
+
comments = 'partial' if t.to_s[0] == '_'
|
38
|
+
line = ['', t.inspect]
|
39
|
+
line + if variables.has_key?(t)
|
40
|
+
["#{variables[t].inspect},", comments_to_s(comments)]
|
41
|
+
else
|
42
|
+
["#{to_code(t)},", comments_to_s(comments, 'required')]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
lines.sort! { |a,b| b[3] <=> a[3] }
|
46
|
+
lines.first[0] = @method_call
|
47
|
+
lines.last[2].chop!
|
48
|
+
max = lines.transpose.map{ |c| c.map(&:length).max }
|
49
|
+
formatted = lines.map{ |line| "%-#{max[0]}s %-#{max[1]}s => %-#{max[2]}s %s" % line }
|
50
|
+
indented = formatted.shift
|
51
|
+
indented = [indented] + formatted.map{ |line| indent + line }
|
52
|
+
indented.join("\n") + "\n "
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def comments_to_s(*comments)
|
57
|
+
comments = comments.compact
|
58
|
+
return '' if comments == []
|
59
|
+
"# #{comments.join(' ')}"
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def to_code(name)
|
64
|
+
keys = name.to_s.split('.').map{ |s| s =~ /^[0..9]+$/ ? s.to_i : s.to_sym }
|
65
|
+
code = keys.shift.to_s
|
66
|
+
return code if keys.empty?
|
67
|
+
keys.each { |k| code << "[#{k.inspect}]" }
|
68
|
+
code
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
def render_sources
|
73
|
+
@sources.map do |source|
|
74
|
+
<<-output.gsub(/^ {14}/m,'')
|
75
|
+
#{'-' * source[:class].name.length}
|
76
|
+
#{source[:class]}
|
77
|
+
#{source[:source]}
|
78
|
+
output
|
79
|
+
end.join("\n")
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
def render_api
|
84
|
+
notice = if @template.is_a?(Elastics::Template::Api) && @template.references['notice']
|
85
|
+
"\nNotice: #{@template.references['notice']}\n "
|
86
|
+
end
|
87
|
+
<<-output.gsub(/^ {12}/m,'')
|
88
|
+
########## #{@method_call} ##########
|
89
|
+
|
90
|
+
API Name: #{@template.references['api_name']}
|
91
|
+
API URL: #{@template.references['api_url']}
|
92
|
+
|
93
|
+
#{render_sources}
|
94
|
+
Usage:
|
95
|
+
#{render_usage(' ' * 12)}#{ notice }
|
96
|
+
output
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
def render_custom
|
101
|
+
<<-output.gsub(/^ {12}/m,'')
|
102
|
+
########## #{@method_call} ##########
|
103
|
+
|
104
|
+
#{render_sources}
|
105
|
+
|
106
|
+
Usage:
|
107
|
+
#{render_usage(' ' * 12)}
|
108
|
+
output
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
def render_stub
|
113
|
+
aliased = if @template.is_a?(Elastics::Template::Api) && @template.references['aliases']
|
114
|
+
"\n# also aliased by: #{@template.aliases.map(&:inspect).join(', ')}"
|
115
|
+
end
|
116
|
+
<<-output.gsub(/^ {12}/m,'')
|
117
|
+
def self.#{@name}(*vars)
|
118
|
+
## this is a stub, used for reference
|
119
|
+
super
|
120
|
+
end#{ aliased }
|
121
|
+
output
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
def render
|
126
|
+
output = (@template.is_a?(Elastics::Template::Api) ? render_api : render_custom)
|
127
|
+
output = output.split("\n").map{ |l| '# ' + l }.join("\n")
|
128
|
+
output << "\n#{render_stub}\n\n"
|
129
|
+
output
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
|
6
135
|
def doc(*names)
|
7
136
|
names = templates.keys if names.empty?
|
8
|
-
doc
|
137
|
+
doc = "\n"
|
9
138
|
names.each do |name|
|
10
|
-
next unless
|
11
|
-
|
12
|
-
temp = templates[name]
|
13
|
-
meth_call = [context, name].join('.')
|
14
|
-
block << <<-meth_call
|
15
|
-
########## #{meth_call} ##########
|
16
|
-
#{'-' * temp.class.to_s.length}
|
17
|
-
#{temp.class}
|
18
|
-
#{temp.to_source}
|
19
|
-
meth_call
|
20
|
-
temp.partials.each do |par_name|
|
21
|
-
par = partials[par_name]
|
22
|
-
block << <<-partial
|
23
|
-
#{'-' * par.class.to_s.length}
|
24
|
-
#{par.class}
|
25
|
-
#{par.to_source}
|
26
|
-
partial
|
27
|
-
end
|
28
|
-
block << "\nUsage:\n"
|
29
|
-
block << build_usage(meth_call, temp)
|
30
|
-
block << "\n "
|
31
|
-
doc << block.split("\n").map{|l| '# ' + l}.join("\n")
|
32
|
-
doc << <<-meth.gsub(/^ {14}/m,'')
|
33
|
-
|
34
|
-
def #{meth_call}(*vars)
|
35
|
-
## this is a stub, used for reference
|
36
|
-
super
|
37
|
-
end
|
38
|
-
|
39
|
-
meth
|
139
|
+
next unless context.respond_to?(name)
|
140
|
+
doc << Output.new(name, self).render
|
40
141
|
end
|
41
142
|
Prompter.say_log doc
|
42
143
|
end
|
43
144
|
|
44
|
-
def usage(name)
|
45
|
-
meth_call = [context, name].join('.')
|
46
|
-
Prompter.say_log build_usage(meth_call, templates[name])
|
47
|
-
end
|
48
145
|
|
49
|
-
|
50
|
-
|
51
|
-
def build_usage(meth_call, temp)
|
52
|
-
variables = temp.instance_eval do
|
53
|
-
interpolate
|
54
|
-
@base_variables.deep_merge @host_elastics && @host_elastics.variables, @temp_variables
|
55
|
-
end
|
56
|
-
all_tags = temp.tags + temp.partials
|
57
|
-
return meth_call if all_tags.size == 0
|
58
|
-
lines = all_tags.map do |t|
|
59
|
-
comments = 'partial' if t.to_s[0] == '_'
|
60
|
-
line = ['', t.inspect]
|
61
|
-
line + if variables.has_key?(t)
|
62
|
-
["#{variables[t].inspect},", comments_to_s(comments)]
|
63
|
-
else
|
64
|
-
["#{to_code(t)},", comments_to_s(comments, 'required')]
|
65
|
-
end
|
66
|
-
end
|
67
|
-
lines.sort! { |a,b| b[3] <=> a[3] }
|
68
|
-
lines.first[0] = meth_call
|
69
|
-
lines.last[2].chop!
|
70
|
-
max = lines.transpose.map { |c| c.map(&:length).max }
|
71
|
-
lines.map { |line| "%-#{max[0]}s %-#{max[1]}s => %-#{max[2]}s %s" % line }.join("\n")
|
146
|
+
def usage(name)
|
147
|
+
Prompter.say_log "\n#{Output.new(name, self).render_usage}\n"
|
72
148
|
end
|
73
149
|
|
74
|
-
def comments_to_s(*comments)
|
75
|
-
comments = comments.compact
|
76
|
-
return '' if comments == []
|
77
|
-
"# #{comments.join(' ')}"
|
78
|
-
end
|
79
150
|
|
80
|
-
def
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
keys.each{|k| code << "[#{k.inspect}]"}
|
85
|
-
code
|
151
|
+
def find(pattern)
|
152
|
+
pattern = /#{pattern}/ unless pattern.is_a?(Regexp)
|
153
|
+
methods = templates.keys.select{ |key| key =~ pattern }
|
154
|
+
Prompter.say_log methods.to_yaml
|
86
155
|
end
|
87
156
|
|
88
157
|
end
|
@@ -8,7 +8,7 @@ module Elastics
|
|
8
8
|
send :define_template, Template::Search, name, args, source_vars
|
9
9
|
end
|
10
10
|
|
11
|
-
#
|
11
|
+
# https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html
|
12
12
|
# requests can be an array of arrays: [[:template1, variable_hash1], [template2, variable_hash2]]
|
13
13
|
# or a hash {:template1 => variable_hash1, template2 => variable_hash2}
|
14
14
|
# The variables are an hash of variables that will be used to render the msearch template
|
@@ -34,24 +34,21 @@ module Elastics
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
# implements search_type=scan (
|
37
|
+
# implements search_type=scan (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-type.html#scan)
|
38
38
|
def scan_search(template, *vars, &block)
|
39
39
|
user_raw_result = vars.any?{|v| v[:raw_result]}
|
40
|
-
scroll
|
41
|
-
search_vars
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
search_temp
|
40
|
+
scroll = '5m'
|
41
|
+
search_vars = Vars.new({:params => { :search_type => 'scan',
|
42
|
+
:scroll => scroll,
|
43
|
+
:size => 50 },
|
44
|
+
:raw_result => true}, *vars)
|
45
|
+
search_temp = template.is_a?(Elastics::Template) ? template : templates[template]
|
46
46
|
|
47
|
-
scroll_vars
|
48
|
-
|
49
|
-
scroll_temp
|
50
|
-
|
51
|
-
|
52
|
-
scroll_vars )
|
53
|
-
search_res = search_temp.render search_vars
|
54
|
-
scroll_id = search_res['_scroll_id']
|
47
|
+
scroll_vars = Vars.new({:params => { :scroll => scroll },
|
48
|
+
:raw_result => true}, variables, *vars)
|
49
|
+
scroll_temp = Elastics::Template.new( :get, '/_search/scroll', nil, scroll_vars )
|
50
|
+
search_res = search_temp.render search_vars
|
51
|
+
scroll_id = search_res['_scroll_id']
|
55
52
|
while (result = scroll_temp.render(:data => scroll_id)) do
|
56
53
|
break if result['hits']['hits'].empty?
|
57
54
|
scroll_id = result['_scroll_id']
|
@@ -60,7 +57,7 @@ module Elastics
|
|
60
57
|
end
|
61
58
|
end
|
62
59
|
|
63
|
-
# implements search_type=count (
|
60
|
+
# implements search_type=count (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-type.html#count)
|
64
61
|
def count_search(template, *vars)
|
65
62
|
template = template.is_a?(Elastics::Template) ? template : templates[template]
|
66
63
|
template.render Vars.new({:params => {:search_type => 'count'}, :raw_result => true}, *vars)
|