elastomer-client 0.4.1 → 0.5.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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +12 -0
  4. data/CHANGELOG.md +15 -0
  5. data/README.md +6 -7
  6. data/Rakefile +21 -0
  7. data/docs/README.md +44 -0
  8. data/docs/bulk_indexing.md +3 -0
  9. data/docs/client.md +240 -0
  10. data/docs/cluster.md +148 -0
  11. data/docs/docs.md +254 -0
  12. data/docs/index.md +161 -0
  13. data/docs/multi_search.md +3 -0
  14. data/docs/notifications.md +24 -11
  15. data/docs/scan_scroll.md +3 -0
  16. data/docs/snapshots.md +3 -0
  17. data/docs/templates.md +3 -0
  18. data/docs/warmers.md +3 -0
  19. data/elastomer-client.gemspec +2 -2
  20. data/lib/elastomer/client.rb +70 -43
  21. data/lib/elastomer/client/bulk.rb +2 -2
  22. data/lib/elastomer/client/cluster.rb +2 -2
  23. data/lib/elastomer/client/docs.rb +190 -54
  24. data/lib/elastomer/client/errors.rb +4 -2
  25. data/lib/elastomer/client/index.rb +111 -43
  26. data/lib/elastomer/client/multi_search.rb +1 -1
  27. data/lib/elastomer/client/nodes.rb +9 -4
  28. data/lib/elastomer/client/repository.rb +2 -2
  29. data/lib/elastomer/client/scroller.rb +235 -0
  30. data/lib/elastomer/client/snapshot.rb +1 -1
  31. data/lib/elastomer/client/template.rb +1 -1
  32. data/lib/elastomer/client/warmer.rb +1 -1
  33. data/lib/elastomer/notifications.rb +1 -1
  34. data/lib/elastomer/version.rb +1 -1
  35. data/script/bootstrap +0 -7
  36. data/script/cibuild +8 -3
  37. data/script/test +6 -0
  38. data/test/client/bulk_test.rb +2 -2
  39. data/test/client/cluster_test.rb +23 -2
  40. data/test/client/docs_test.rb +137 -6
  41. data/test/client/errors_test.rb +12 -8
  42. data/test/client/index_test.rb +88 -5
  43. data/test/client/multi_search_test.rb +29 -0
  44. data/test/client/repository_test.rb +36 -37
  45. data/test/client/{scan_test.rb → scroller_test.rb} +25 -6
  46. data/test/client/snapshot_test.rb +53 -43
  47. data/test/client/stubbed_client_test.rb +1 -1
  48. data/test/client_test.rb +60 -0
  49. data/test/notifications_test.rb +69 -0
  50. data/test/test_helper.rb +54 -11
  51. metadata +36 -23
  52. data/.ruby-version +0 -1
  53. data/lib/elastomer/client/scan.rb +0 -161
  54. data/script/testsuite +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 81dcb0ea764810dd5a824281170423608a0ab5f2
4
- data.tar.gz: 089264a40b4574bccf618b35cc258266bb06ec94
3
+ metadata.gz: 1ef2b4c790e85cb9d9141c34ae1945b230cadeb8
4
+ data.tar.gz: 463229368a9644620aab366e4ad67efa393e47fa
5
5
  SHA512:
6
- metadata.gz: fd7298fd7537c9bcdc07f7be3bae04bcd77c83c20cbd3b0c7e410d339cc55f2ecaebb4f9dd3bc53305705cd19a44311cbd301f4f813c172035e2f36a1d1dcf12
7
- data.tar.gz: 8eb7574b104215ee1a66a346a29c10d8ee00ea1273a4a213c8756b8ebdb1f07a25c8fe118bccfdca073c6a607e4a77e1bb32e14f999d855e5e9a8b7795c05238
6
+ metadata.gz: 904e906d03a23949bc0725932be4d7aaf6cd23185ab5a382160c7611e6c500adc03283813068a3fdfca5d067253736b309c7a74767d0c1a1a0d28b6a5e689689
7
+ data.tar.gz: 0f0d9fcb4527e8a0b1e43df7fba7c2d5fb822c78e8270e4ec4e239d0439647bbe6afbe2f569093ec0cffed21623187b1420ee3d7c4b4ae5148f6dd8accbe7ef9
data/.gitignore CHANGED
@@ -2,6 +2,7 @@
2
2
  /vendor/gems
3
3
  /.bundle
4
4
  /.rbenv-version
5
+ /.ruby-version
5
6
  /vendor/cache/*.gem
6
7
  /coverage
7
8
  Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.1
4
+ - 1.9.3
5
+
6
+ services:
7
+ - elasticsearch
8
+
9
+ notifications:
10
+ email: false
11
+
12
+ sudo: false
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## 0.5.0 (2015-01-21)
2
+ - BREAKING: rename action.available notification to action.ping
3
+ - Index Component
4
+ - client.index no longer requires a name
5
+ - Documents Component
6
+ - client.docs no longer requires an index name
7
+ - added an `exists?` method
8
+ - added `termvector` and `multi_termvectors` methods
9
+ - added a `search_shards` method
10
+ - added an `mget` alias for `multi_get`
11
+ - Adding more documentation
12
+ - Rename client.available? to client.ping (aliased as available?)
13
+ - Updating tests to pass with ES 1.4.X
14
+ - Enabling regular scroll queries vi `Client#scroll`
15
+
1
16
  ## 0.4.1 (2014-10-14)
2
17
  - Support for index `_recovery` endpoint
3
18
  - Fix Faraday 0.8 support
data/README.md CHANGED
@@ -1,16 +1,16 @@
1
- # Elastomer
1
+ # Elastomer Client [![Build Status](https://travis-ci.org/github/elastomer-client.svg)](https://travis-ci.org/github/elastomer-client)
2
2
 
3
3
  Making a stupid simple ElasticSearch client so your project can be smarter!
4
4
 
5
5
  ## Getting Started
6
6
 
7
- Use [Boxen](https://setup.githubapp.com) to get your machine set up. Then:
7
+ Get started by cloning and running a few scripts:
8
8
 
9
9
  ```
10
10
  $ git clone https://github.com/github/elastomer-client.git
11
11
  $ cd elastomer-client
12
12
  $ script/bootstrap
13
- $ script/testsuite
13
+ $ script/test
14
14
  ```
15
15
 
16
16
  ## Client
@@ -75,10 +75,9 @@ index.delete
75
75
 
76
76
  #### Docs
77
77
 
78
- This decomposition is the most questionable, but it's a starting point. The
79
- [Docs](lib/elastomer/client/docs.rb) class handles the indexing and searching
80
- of documents. Each instance is scoped to an index and optionally a document
81
- type.
78
+ The [Docs](lib/elastomer/client/docs.rb) class handles the indexing and
79
+ searching of documents. Each instance is scoped to an index and optionally a
80
+ document type.
82
81
 
83
82
  ```ruby
84
83
  require 'elastomer/client'
data/Rakefile CHANGED
@@ -7,3 +7,24 @@ Rake::TestTask.new do |t|
7
7
  end
8
8
 
9
9
  task :default => :test
10
+
11
+ namespace :actions do
12
+ desc "list valid actions"
13
+ task :list do
14
+ # there are two distinct :action declarations we need to find
15
+ # the regular expressions below capture both
16
+ #
17
+ # [:action] = 'some.value'
18
+ # :action => 'some.value'
19
+ #
20
+ list = %x(grep '\\[\\?:action\\]\\?\\s\\+=' `find lib -name '*.rb'`).split("\n")
21
+ list.map! do |line|
22
+ m = /\A.*?\[?:action\]?\s+=>?\s+'(.*?)'.*\Z/.match line
23
+ m.nil? ? nil : m[1]
24
+ end
25
+
26
+ list.compact.sort.uniq.each do |action|
27
+ STDOUT.puts "- #{action}"
28
+ end
29
+ end
30
+ end
data/docs/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # Elastomer Client in Depth
2
+
3
+ We first started building the Elastomer Client gem when an
4
+ [official client](https://github.com/elasticsearch/elasticsearch-ruby)
5
+ was not yet available from ElasticSearch. We were looking for a client that
6
+ provided a one-to-one mapping of the ElasticSearch APIs and avoided higher level
7
+ complexity such as connection pooling, round-robin connections, thrift support,
8
+ and the like. We think these things these things are bettered handled at
9
+ different layers and by other software libraries.
10
+
11
+ Our goal is to keep our ElasticSearch client simple and then compose
12
+ higher level functionality from smaller components. This is the UNIX philosophy
13
+ in action.
14
+
15
+ To that end we have tried to be as faithful as possible to the ElasticSearch API
16
+ with our implementation. There are a few places where it made sense to wrap the
17
+ ElasticSearch API inside Ruby idioms. One notable location is the
18
+ [scan-scroll](http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/scan-scroll.html)
19
+ search type; the Elastomer Client provides a Ruby iterator to work with these
20
+ types of queries.
21
+
22
+ Below are links to documents describing the various components of the Elastomer
23
+ Client library. Start with the core components - specifically the **Client**
24
+ document. All the other components are built atop the client.
25
+
26
+ **Core Components**
27
+
28
+ * [Client](client.md)
29
+ * [Index](index.md)
30
+ * [Documents](docs.md)
31
+ * [Cluster](cluster.md)
32
+ * [Templates](templates.md)
33
+ * [Warmers](warmers.md)
34
+
35
+ **Bulk Components**
36
+
37
+ * [Bulk Indexing](bulk_indexing.md)
38
+ * [Multi-Search](multi_search.md)
39
+ * [Scan/Scroll](scan_scroll.md)
40
+
41
+ **Operational Components**
42
+
43
+ * [Snapshots](snapshots.md)
44
+ * [Notifications](notifications.md)
@@ -0,0 +1,3 @@
1
+ # Elastomer Bulk Indexing Component
2
+
3
+ ![constructocat](https://octodex.github.com/images/constructocat2.jpg)
data/docs/client.md ADDED
@@ -0,0 +1,240 @@
1
+ # Elastomer Client Component
2
+
3
+ All methods in the Elastomer Client gem eventually make an HTTP request to
4
+ ElasticSearch. The [`Elastomer::Client`](https://github.com/github/elastomer-client/blob/master/lib/elastomer/client.rb)
5
+ class is responsible for connecting to an ElasticSearch instance, making HTTP
6
+ requests, processing the response, and handling errors. Let's look at the
7
+ details of how `Elastomer::Client` handles HTTP communication.
8
+
9
+ ### Connecting
10
+
11
+ We use the [Faraday](https://github.com/lostisland/faraday) gem for all HTTP
12
+ communication. Faraday provides a uniform wrapper around several different HTTP
13
+ clients allowing any of these clients to be used at runtime. Faraday also has
14
+ the concept of *middlewares* that operate on the HTTP request and response. We
15
+ use Faraday middleware to encode and decode JSON messages exchanged with
16
+ ElasticSearch.
17
+
18
+ Without any options the `Elastomer::Client` will connect to the default
19
+ ElasticSearch URL `http://localhost:9200`. The `Net:HTTP` client from the Ruby
20
+ standard library will be used.
21
+
22
+ ```ruby
23
+ client = Elastomer::Client.new
24
+ client.host #=> 'localhost'
25
+ client.port #=> 9200
26
+ client.url #=> 'http://localhost:9200'
27
+ ```
28
+
29
+ [Boxen](https://boxen.github.com) configures ElasticSearch to listen on port
30
+ `19200` instead of the standard port. We can provide either the full URL or just
31
+ a different port number if ElasticSearch is running on `localhost`.
32
+
33
+ ```ruby
34
+ client = Elastomer::Client.new :port => 19200
35
+ client.host #=> 'localhost'
36
+ client.port #=> 19200
37
+ client.url #=> 'http://localhost:19200'
38
+
39
+ client = Elastomer::Client.new :url => "http://localhost:19200"
40
+ ```
41
+
42
+ ElasticSearch works best with persistent connections. We can use the
43
+ `Net::HTTP::Persistent` adapter with Faraday.
44
+
45
+ ```ruby
46
+ client = Elastomer::Client.new \
47
+ :port => 19200,
48
+ :adapter => :net_http_persistent
49
+ ```
50
+
51
+ We also want to configure the `:open_timeout` (for making the initial connection
52
+ to ElasticSearch) and the `:read_timeout` (used to limit each request). The open
53
+ timeout should be short - it defaults to 2 seconds. The read timeout should be
54
+ longer, but it can vary depending upon the type of request you are making. Large
55
+ bulk requests will take longer than a quick count query.
56
+
57
+ The open timeout is configured once when the client is first created. The read
58
+ timeout can be set for each request.
59
+
60
+ ```ruby
61
+ client = Elastomer::Client.new \
62
+ :url => "http:/localhost:19200",
63
+ :adapter => :net_http_persistent,
64
+ :open_timeout => 1,
65
+ :read_timeout => 5
66
+
67
+ client.get("/", :read_timeout => 1)
68
+ ```
69
+
70
+ Because each library handles read timeouts differently, some caution must be
71
+ used. Persistent connections might or might not be closed and reopened when the
72
+ read timeout is reached. If the connection is left open and reused, then the
73
+ returned data might actually be from a previous request. This can lead to all
74
+ kinds of horrible data leaks.
75
+
76
+ ElasticSearch provides an `X-Opaque-Id` request header. Any value set in this
77
+ request header will be returned in the corresponding response header. This
78
+ allows the client to correlate the response from ElasticSearch with the request
79
+ that was submitted. We have written an
80
+ [OpaqueId](https://github.com/github/elastomer-client/blob/master/lib/elastomer/middleware/opaque_id.rb)
81
+ middleware that will abort any request if the `X-Opaque-Id` headers disagree
82
+ between the request and the response. You can use this feature by setting
83
+ the `:opaque_id` flag.
84
+
85
+ ```ruby
86
+ client = Elastomer::Client.new \
87
+ :url => "http://localhost:19200",
88
+ :adapter => :net_http_persistent,
89
+ :opaque_id => true
90
+ ```
91
+
92
+ If you are not using persistent connections, then you do not need to worry about
93
+ `X-Opaque-Id` headers.
94
+
95
+ ### HTTP Methods
96
+
97
+ The standard HTTP verbs - `head`, `get`, `put`, `post`, `delete` - are exposed
98
+ as methods on the `Elastomer::Client` class. Each method accepts a path and a
99
+ Hash of parameters. Some parameters are applied as path expansions, some are
100
+ reserved, and the remainder are used as URL parameters. We'll look at the
101
+ reserved parameters first.
102
+
103
+ #### Reserved Parameters
104
+
105
+ **:body**
106
+
107
+ The value passed in as the `:body` parameter will be used as the body of the
108
+ HTTP request. The HTTP `head` method does not support a request body and ignores
109
+ this parameter. The other HTTP methods all support request bodies.
110
+
111
+ The `:body` value will be converted into JSON format before being sent to
112
+ ElasticSearch unless the body is a String or an Array. If the body is a String
113
+ it is assumed to already be JSON formatted, and it is sent to ElasticSearch as
114
+ is without any modifications. When the body is an Array then all the items are
115
+ joined with a newline character `\n` and a trailing newline is appended; this
116
+ supports [bulk](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html)
117
+ indexing and [multi-search](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-multi-search.html)
118
+ requests.
119
+
120
+ **:read_timeout**
121
+
122
+ The read timeout for the HTTP network calls can be changed on a per-call basis.
123
+ If a `:read_timeout` is supplied then it will be used instead of the global read
124
+ timeout configured during initialization. This is useful for large bulk
125
+ operations that might take longer than normal.
126
+
127
+ ```ruby
128
+ client.cluster.health \
129
+ :index => "test-index-1",
130
+ :wait_for_status => "green",
131
+ :timeout => "5s",
132
+ :read_timeout => 7
133
+ ```
134
+
135
+ In the example above we are waiting for the named index to reach a green state.
136
+ The `:timeout` of 5 seconds is passed to ElasticSearch. This call will return
137
+ after 5 seconds even if the index has not yet reached green status. So we set
138
+ our network call timeout to 7 seconds to ensure we don't kill the request before
139
+ ElasticSearch has responded.
140
+
141
+ **:action** and **:context**
142
+
143
+ Each method in the Elastomer client gem has its own `:action` value that is
144
+ used in conjunction with the [notifications](notifications.md) layer. The
145
+ `:action` parameter cannot be changed by the user. Instead you can provide a
146
+ `:context` value to each method call. This will be passed unchanged to the
147
+ notifications layer, and it is useful for tracking where an Elastomer client
148
+ method is called from within your application.
149
+
150
+ #### URL Handling
151
+
152
+ URLs are generated by combining a URL template with values extracted from the
153
+ parameters. The [Addressable](https://github.com/sporkmonger/addressable) gem is
154
+ used for this URL template expansion.
155
+
156
+ With the [`Addressable::Template`](https://github.com/sporkmonger/addressable#uri-templates)
157
+ a typical search URL takes the form `{/index}{/type}/_search`. The `:index` and
158
+ `:type` values are taken from the parameters Hash and combined with the template
159
+ to generate the URL. The internal
160
+ [`expand_path`](https://github.com/github/elastomer-client/blob/master/lib/elastomer/client.rb#L245)
161
+ method handles the URL generation.
162
+
163
+ Here are a few examples to better illustrate the concept.
164
+
165
+ ```ruby
166
+ client.expand_path("{/index}{/type}/_search", {
167
+ :q => "*:*"
168
+ })
169
+ #=> "/_search?q=*:*"
170
+
171
+ client.expand_path("{/index}{/type}/_search", {
172
+ :index => "twitter",
173
+ :q => "*:*"
174
+ })
175
+ #=> "/twitter/_search?q=*:*"
176
+
177
+ client.expand_path("{/index}{/type}/_search", {
178
+ :index => "twitter",
179
+ :type => "tweet",
180
+ :q => "*:*"
181
+ })
182
+ #=> "/twitter/tweet/_search?q=*:*"
183
+
184
+ client.expand_path("{/index}{/type}/_search", {
185
+ :index => "twitter",
186
+ :type => ["tweet", "user"],
187
+ :q => "*:*"
188
+ :search_type => "count"
189
+ })
190
+ #=> "/twitter/tweet,user/_search?q=*:*&search_type=count"
191
+ ```
192
+
193
+ In the examples above the path elements are optional. We can force them to be
194
+ required and non-empty using a slightly different template syntax. In the
195
+ example below we are requiring the `:index` and `:type` parameters to be
196
+ provided. If either of them are missing (or nil or an empty string) then an
197
+ `ArgumentError` is raised.
198
+
199
+ ```ruby
200
+ client.expand_path("/{index}/{type}/_search", {
201
+ :index => "twitter",
202
+ :q => "*:*"
203
+ })
204
+ #=> raises an ArgumentError - :type is missing
205
+
206
+ client.expand_path("/{index}/{type}/_search", {
207
+ :index => "twitter",
208
+ :type => " ",
209
+ :q => "*:*"
210
+ })
211
+ #=> raises an ArgumentError - :type is an empty string
212
+ ```
213
+
214
+ And that is the basic concept of the `expand_path` method. The URL template
215
+ pattern is used extensively in the Elastomer client code, so it is definitely
216
+ worth knowing about.
217
+
218
+ ### Errors
219
+
220
+ Invariably things will go wrong where computers and networks are involved. The
221
+ Elastomer client code makes no attempt to retry an operation in the face of an
222
+ error. However, it does classify errors into *fatal* and *retryable* exceptions.
223
+
224
+ Each class that inherits from
225
+ [`Elastomer::Client::Error`](https://github.com/github/elastomer-client/blob/master/lib/elastomer/client/errors.rb)
226
+ has a `fatal?` method (and the inverse `retry?` method). If an exception is
227
+ fatal, then the request is fundamentally flawed and should not be retried.
228
+ Passing a malformed search query or trying to search an index that does not
229
+ exist are both examples of fatal errors - the request will never succeed.
230
+
231
+ If an error is not fatal then it can be retried. If the ElasticSearch cluster
232
+ has a full search queue then any query will fail. It not the fault of the user
233
+ or the query itself - ElasticSearch just needs more capacity. The query can be
234
+ safely retried.
235
+
236
+ Therein lies the rub, though. Retrying a search or any operation will continue
237
+ to add load to a search cluster that might already be experiencing problems.
238
+ Blindly retrying an operation might do more harm than good. It is left to the
239
+ user to implement their own exponential back-off scheme or to implement some
240
+ status / back-pressure system.
data/docs/cluster.md ADDED
@@ -0,0 +1,148 @@
1
+ # Elastomer Cluster Component
2
+
3
+ The cluster component deals with commands for managing cluster state and
4
+ monitoring cluster health. All the commands found under the
5
+ [cluster API](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster.html)
6
+ section of the ElasticSearch documentation are implemented by the
7
+ [`cluster.rb`](https://github.com/github/elastomer-client/blob/master/lib/elastomer/client/cluster.rb)
8
+ module and the [`nodes.rb`](https://github.com/github/elastomer-client/blob/master/lib/elastomer/client/nodes.rb)
9
+ module.
10
+
11
+ ## Cluster
12
+
13
+ API endpoints dealing with cluster level information and settings are found in
14
+ the [`Cluster`](lib/elastomer/client/cluster.rb) class. Each of these methods
15
+ corresponds to an API endpoint described in the ElasticSearch documentation
16
+ (linked to above). The params listed in the documentation can be passed to these
17
+ methods, so we do not take too much trouble to enumerate them all.
18
+
19
+ #### health
20
+
21
+ The cluster [health API](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-health.html)
22
+ returns a very simple cluster health status report.
23
+
24
+ ```ruby
25
+ require 'elastomer/client'
26
+ client = Elastomer::Client.new :port => 19200
27
+
28
+ # the current health summary
29
+ client.cluster.health
30
+ ```
31
+
32
+ You can wait for a *yellow* status.
33
+
34
+ ```ruby
35
+ client.cluster.health \
36
+ :wait_for_status => "yellow",
37
+ :timeout => "10s",
38
+ :read_timeout => 12
39
+ ```
40
+
41
+ And you can request index level health details. The default timeout for the
42
+ health endpoint is 30 seconds; hence, we set our read timeout to 32 seconds.
43
+
44
+ ```ruby
45
+ client.cluster.health \
46
+ :level => "indices",
47
+ :read_timeout => 32
48
+ ```
49
+
50
+ #### state & stats
51
+
52
+ If you need something more than basic health information, then the
53
+ [`state`](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-state.html)
54
+ and [`stats`](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-stats.html)
55
+ endpoints are the next methods to call. Please look through the API
56
+ documentation linked to above for all the details. And you can play with these
57
+ endpoints via an IRB session.
58
+
59
+ ```ruby
60
+ # detailed cluster state information
61
+ client.cluster.state
62
+
63
+ # cluster wide statistics
64
+ client.cluster.stats
65
+ ```
66
+
67
+ #### settings
68
+
69
+ Cluster behavior is controlled via the
70
+ [settings API](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-update-settings.html).
71
+ The settings can be retrieved, and some settings can be modified at runtime to
72
+ control shard allocations, routing, index replicas, and so forth. For example,
73
+ when performing a [rolling restart](http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_rolling_restarts.html)
74
+ of a cluster, disabling shard allocation between restarts can reduce the
75
+ cluster recovery time.
76
+
77
+ ```ruby
78
+ # disable all shard allocation
79
+ client.cluster.update_settings :transient => {
80
+ "cluster.routing.allocation.enable" => "none"
81
+ }
82
+
83
+ # shutdown the local node
84
+ client.nodes('_local').shutdown
85
+
86
+ # restart the local node and wait for it to rejoin the cluster
87
+
88
+ # re-enable shard allocation
89
+ client.cluster.update_settings :transient => {
90
+ "cluster.routing.allocation.enable" => "all"
91
+ }
92
+ ```
93
+
94
+ #### extras
95
+
96
+ We've added a few extras to the `cluster` module purely for convenience. These
97
+ are not API mappings; they are requests we frequently make from our
98
+ applications.
99
+
100
+ ```ruby
101
+ # the list of all index templates
102
+ client.cluster.templates
103
+
104
+ # list all the indices in the cluster
105
+ client.cluster.indices
106
+
107
+ # list all nodes that are currently part of the cluster
108
+ client.cluster.nodes
109
+ ```
110
+
111
+ Using these methods we can quickly get the names of all the indices in the
112
+ cluster. The `indices` method returns a hash of the index settings keyed by the
113
+ index name.
114
+
115
+ ```ruby
116
+ client.cluster.indices.keys
117
+ ```
118
+
119
+ The same method can be used for getting all the template names, as well.
120
+
121
+ ## Nodes
122
+
123
+ There are also node level API methods that provide stats and information for
124
+ individual (or multiple) nodes in the cluster. We expose these via the `nodes`
125
+ module in elastomer-client.
126
+
127
+ ```ruby
128
+ require 'elastomer/client'
129
+ client = Elastomer::Client.new :port => 19200
130
+
131
+ # gather OS, JVM, and process information from the local node
132
+ client.nodes("_local").info(:info => %w[os jvm process])
133
+ ```
134
+
135
+ More than one node can be queried at the same time.
136
+
137
+ ```ruby
138
+ client.nodes(%w[node-1.local node-2.local]).stats(:stats => %w[os process])
139
+ ```
140
+
141
+ Or you can query all nodes.
142
+
143
+ ```ruby
144
+ client.nodes("_all").stats(:stats => "fs")
145
+ ```
146
+
147
+ Take a look at the source code documentation for all the API calls provided by
148
+ elastomer-client.