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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +12 -0
- data/CHANGELOG.md +15 -0
- data/README.md +6 -7
- data/Rakefile +21 -0
- data/docs/README.md +44 -0
- data/docs/bulk_indexing.md +3 -0
- data/docs/client.md +240 -0
- data/docs/cluster.md +148 -0
- data/docs/docs.md +254 -0
- data/docs/index.md +161 -0
- data/docs/multi_search.md +3 -0
- data/docs/notifications.md +24 -11
- data/docs/scan_scroll.md +3 -0
- data/docs/snapshots.md +3 -0
- data/docs/templates.md +3 -0
- data/docs/warmers.md +3 -0
- data/elastomer-client.gemspec +2 -2
- data/lib/elastomer/client.rb +70 -43
- data/lib/elastomer/client/bulk.rb +2 -2
- data/lib/elastomer/client/cluster.rb +2 -2
- data/lib/elastomer/client/docs.rb +190 -54
- data/lib/elastomer/client/errors.rb +4 -2
- data/lib/elastomer/client/index.rb +111 -43
- data/lib/elastomer/client/multi_search.rb +1 -1
- data/lib/elastomer/client/nodes.rb +9 -4
- data/lib/elastomer/client/repository.rb +2 -2
- data/lib/elastomer/client/scroller.rb +235 -0
- data/lib/elastomer/client/snapshot.rb +1 -1
- data/lib/elastomer/client/template.rb +1 -1
- data/lib/elastomer/client/warmer.rb +1 -1
- data/lib/elastomer/notifications.rb +1 -1
- data/lib/elastomer/version.rb +1 -1
- data/script/bootstrap +0 -7
- data/script/cibuild +8 -3
- data/script/test +6 -0
- data/test/client/bulk_test.rb +2 -2
- data/test/client/cluster_test.rb +23 -2
- data/test/client/docs_test.rb +137 -6
- data/test/client/errors_test.rb +12 -8
- data/test/client/index_test.rb +88 -5
- data/test/client/multi_search_test.rb +29 -0
- data/test/client/repository_test.rb +36 -37
- data/test/client/{scan_test.rb → scroller_test.rb} +25 -6
- data/test/client/snapshot_test.rb +53 -43
- data/test/client/stubbed_client_test.rb +1 -1
- data/test/client_test.rb +60 -0
- data/test/notifications_test.rb +69 -0
- data/test/test_helper.rb +54 -11
- metadata +36 -23
- data/.ruby-version +0 -1
- data/lib/elastomer/client/scan.rb +0 -161
- data/script/testsuite +0 -10
data/docs/scan_scroll.md
ADDED
data/docs/snapshots.md
ADDED
data/docs/templates.md
ADDED
data/docs/warmers.md
ADDED
data/elastomer-client.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Elastomer::VERSION
|
9
9
|
spec.authors = ["Tim Pease", "Grant Rodgers"]
|
10
10
|
spec.email = ["tim.pease@github.com", "grant.rodgers@github.com"]
|
11
|
-
spec.summary = %q{A library for interacting with
|
11
|
+
spec.summary = %q{A library for interacting with Elasticsearch}
|
12
12
|
spec.description = %q{Elastomer is a low level API client for the
|
13
13
|
Elasticsearch HTTP interface.}
|
14
14
|
spec.homepage = "https://github.com/github/elastomer-client"
|
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_dependency "semantic", "~> 1.3"
|
26
26
|
|
27
27
|
spec.add_development_dependency "bundler", "~> 1.5"
|
28
|
+
spec.add_development_dependency "activesupport", ">= 3.0"
|
28
29
|
spec.add_development_dependency "minitest","~> 4.7"
|
29
30
|
spec.add_development_dependency "rake"
|
30
|
-
spec.add_development_dependency "debugger", "~> 1.6.8"
|
31
31
|
end
|
data/lib/elastomer/client.rb
CHANGED
@@ -40,12 +40,13 @@ module Elastomer
|
|
40
40
|
attr_reader :read_timeout, :open_timeout
|
41
41
|
|
42
42
|
# Returns true if the server is available; returns false otherwise.
|
43
|
-
def
|
44
|
-
response = head '/', :action => 'cluster.
|
43
|
+
def ping
|
44
|
+
response = head '/', :action => 'cluster.ping'
|
45
45
|
response.success?
|
46
46
|
rescue StandardError
|
47
47
|
false
|
48
48
|
end
|
49
|
+
alias_method :available?, :ping
|
49
50
|
|
50
51
|
# Returns the version String of the attached ElasticSearch instance.
|
51
52
|
def version
|
@@ -74,7 +75,7 @@ module Elastomer
|
|
74
75
|
conn.response :parse_json
|
75
76
|
conn.request :opaque_id if @opaque_id
|
76
77
|
|
77
|
-
|
78
|
+
@adapter.is_a?(Array) ?
|
78
79
|
conn.adapter(*@adapter) :
|
79
80
|
conn.adapter(@adapter)
|
80
81
|
|
@@ -150,52 +151,78 @@ module Elastomer
|
|
150
151
|
# Returns a Faraday::Response
|
151
152
|
# Raises an Elastomer::Client::Error on 4XX and 5XX responses
|
152
153
|
def request( method, path, params )
|
153
|
-
body = params.delete :body
|
154
|
-
body = MultiJson.dump body if Hash === body
|
155
|
-
|
156
154
|
read_timeout = params.delete :read_timeout
|
157
|
-
|
155
|
+
body = extract_body params
|
158
156
|
path = expand_path path, params
|
159
157
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
158
|
+
instrument(path, body, params) do
|
159
|
+
begin
|
160
|
+
response = case method
|
161
|
+
when :head
|
162
|
+
connection.head(path) { |req| req.options[:timeout] = read_timeout if read_timeout }
|
163
|
+
|
164
|
+
when :get
|
165
|
+
connection.get(path) { |req|
|
166
|
+
req.body = body if body
|
167
|
+
req.options[:timeout] = read_timeout if read_timeout
|
168
|
+
}
|
169
|
+
|
170
|
+
when :put
|
171
|
+
connection.put(path, body) { |req| req.options[:timeout] = read_timeout if read_timeout }
|
172
|
+
|
173
|
+
when :post
|
174
|
+
connection.post(path, body) { |req| req.options[:timeout] = read_timeout if read_timeout }
|
175
|
+
|
176
|
+
when :delete
|
177
|
+
connection.delete(path) { |req|
|
178
|
+
req.body = body if body
|
179
|
+
req.options[:timeout] = read_timeout if read_timeout
|
180
|
+
}
|
181
|
+
|
182
|
+
else
|
183
|
+
raise ArgumentError, "unknown HTTP request method: #{method.inspect}"
|
184
|
+
end
|
185
|
+
|
186
|
+
handle_errors response
|
187
|
+
|
188
|
+
# wrap Faraday errors with appropriate Elastomer::Client error classes
|
189
|
+
rescue Faraday::Error::ClientError => boom
|
190
|
+
error_name = boom.class.name.split('::').last
|
191
|
+
error_class = Elastomer::Client.const_get(error_name) rescue Elastomer::Client::Error
|
192
|
+
raise error_class.new(boom, method.upcase, path)
|
185
193
|
end
|
186
194
|
end
|
195
|
+
end
|
187
196
|
|
188
|
-
|
189
|
-
|
190
|
-
#
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
197
|
+
# Internal: Extract the :body from the params Hash and convert it to a
|
198
|
+
# JSON String format. If the params Hash does not contain a :body then no
|
199
|
+
# action is taken and `nil` is returned.
|
200
|
+
#
|
201
|
+
# If a :body is present and is a String then it is assumed to a JSON String
|
202
|
+
# and returned "as is".
|
203
|
+
#
|
204
|
+
# If a :body is present and is an Array then we join the values together
|
205
|
+
# with newlines and append a trailing newline. This is a special case for
|
206
|
+
# dealing with ES `bulk` imports and `multi_search` methods.
|
207
|
+
#
|
208
|
+
# Otherwise we convert the :body to a JSON string and return.
|
209
|
+
#
|
210
|
+
# params - Parameters Hash
|
211
|
+
#
|
212
|
+
# Returns the request body as a String or `nil` if no :body is present
|
213
|
+
def extract_body( params )
|
214
|
+
body = params.delete :body
|
215
|
+
return if body.nil?
|
195
216
|
|
196
|
-
|
197
|
-
|
198
|
-
|
217
|
+
case body
|
218
|
+
when String
|
219
|
+
body
|
220
|
+
when Array
|
221
|
+
body << nil unless body.last.nil?
|
222
|
+
body.join "\n"
|
223
|
+
else
|
224
|
+
MultiJson.dump body
|
225
|
+
end
|
199
226
|
end
|
200
227
|
|
201
228
|
# Internal: Apply path expansions to the `path` and append query
|
@@ -263,7 +290,7 @@ module Elastomer
|
|
263
290
|
# containing and 'error' field.
|
264
291
|
def handle_errors( response )
|
265
292
|
raise ServerError, response if response.status >= 500
|
266
|
-
raise RequestError, response if
|
293
|
+
raise RequestError, response if response.body.is_a?(Hash) && response.body['error']
|
267
294
|
|
268
295
|
response
|
269
296
|
end
|
@@ -206,14 +206,14 @@ module Elastomer
|
|
206
206
|
@actions.clear
|
207
207
|
end
|
208
208
|
|
209
|
-
SPECIAL_KEYS = %w[id type index version version_type routing parent
|
209
|
+
SPECIAL_KEYS = %w[id type index version version_type routing parent timestamp ttl consistency refresh retry_on_conflict]
|
210
210
|
SPECIAL_KEYS_HASH = SPECIAL_KEYS.inject({}) { |h, k| h[k] = "_#{k}"; h }
|
211
211
|
|
212
212
|
# Internal: convert special key parameters to their wire representation
|
213
213
|
# and apply any override document parameters.
|
214
214
|
def prepare_params(document, params)
|
215
215
|
params = convert_special_keys(params)
|
216
|
-
|
216
|
+
if document.is_a? Hash
|
217
217
|
params = from_document(document).merge(params)
|
218
218
|
end
|
219
219
|
params.delete(:_id) if params[:_id].nil? || params[:_id].to_s.empty?
|
@@ -95,7 +95,7 @@ module Elastomer
|
|
95
95
|
response = client.get '/_cluster/settings', params.merge(:action => 'cluster.get_settings')
|
96
96
|
response.body
|
97
97
|
end
|
98
|
-
|
98
|
+
alias_method :settings, :get_settings
|
99
99
|
|
100
100
|
# Update cluster wide specific settings. Settings updated can either be
|
101
101
|
# persistent (applied cross restarts) or transient (will not survive a
|
@@ -185,7 +185,7 @@ module Elastomer
|
|
185
185
|
response = client.get '{/index}/_aliases', params.merge(:action => 'cluster.get_aliases')
|
186
186
|
response.body
|
187
187
|
end
|
188
|
-
|
188
|
+
alias_method :aliases, :get_aliases
|
189
189
|
|
190
190
|
# Perform an aliases action on the cluster. We are just a teensy bit
|
191
191
|
# clever here in that a single action can be given or an array of
|
@@ -2,13 +2,16 @@
|
|
2
2
|
module Elastomer
|
3
3
|
class Client
|
4
4
|
|
5
|
-
# Provides access to document-level API commands.
|
5
|
+
# Provides access to document-level API commands. Indexing documents and
|
6
|
+
# searching documents are both handled by this module.
|
6
7
|
#
|
7
|
-
# name - The name of the index as a String
|
8
|
-
# type - The document type as a String
|
8
|
+
# name - The name of the index as a String (optional)
|
9
|
+
# type - The document type as a String (optional)
|
10
|
+
#
|
11
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs.html
|
9
12
|
#
|
10
13
|
# Returns a Docs instance.
|
11
|
-
def docs( name, type = nil )
|
14
|
+
def docs( name = nil, type = nil )
|
12
15
|
Docs.new self, name, type
|
13
16
|
end
|
14
17
|
|
@@ -23,21 +26,47 @@ module Elastomer
|
|
23
26
|
#
|
24
27
|
def initialize( client, name, type = nil )
|
25
28
|
@client = client
|
26
|
-
@name = @client.assert_param_presence(name, 'index name')
|
29
|
+
@name = @client.assert_param_presence(name, 'index name') unless name.nil?
|
27
30
|
@type = @client.assert_param_presence(type, 'document type') unless type.nil?
|
28
31
|
end
|
29
32
|
|
30
33
|
attr_reader :client, :name, :type
|
31
34
|
|
32
|
-
# Adds or updates a document in the index, making it searchable.
|
33
|
-
#
|
35
|
+
# Adds or updates a document in the index, making it searchable. If the
|
36
|
+
# document contains an `:_id` attribute then PUT semantics will be used to
|
37
|
+
# create (or update) a document with that ID. If no ID is provided then a
|
38
|
+
# new document will be created using POST semantics.
|
39
|
+
#
|
40
|
+
# There are several other document attributes that control how
|
41
|
+
# ElasticSearch will index the document. They are listed below. Please
|
42
|
+
# refer to the ElasticSearch documentation for a full explanation of each
|
43
|
+
# and how it affects the indexing process.
|
44
|
+
#
|
45
|
+
# :_id
|
46
|
+
# :_type
|
47
|
+
# :_version
|
48
|
+
# :_version_type
|
49
|
+
# :_op_type
|
50
|
+
# :_routing
|
51
|
+
# :_parent
|
52
|
+
# :_timestamp
|
53
|
+
# :_ttl
|
54
|
+
# :_consistency
|
55
|
+
# :_replication
|
56
|
+
# :_refresh
|
57
|
+
#
|
58
|
+
# If any of these attributes are present in the document they will be
|
59
|
+
# removed from the document before it is indexed. This means that the
|
60
|
+
# document will be modified by this method.
|
34
61
|
#
|
35
62
|
# document - The document (as a Hash or JSON encoded String) to add to the index
|
36
63
|
# params - Parameters Hash
|
37
64
|
#
|
65
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-index_.html
|
66
|
+
#
|
38
67
|
# Returns the response body as a Hash
|
39
68
|
def index( document, params = {} )
|
40
|
-
overrides = from_document
|
69
|
+
overrides = from_document document
|
41
70
|
params = update_params(params, overrides)
|
42
71
|
params[:action] = 'docs.index'
|
43
72
|
|
@@ -56,9 +85,10 @@ module Elastomer
|
|
56
85
|
# Delete a document from the index based on the document ID. The :id is
|
57
86
|
# provided as part of the params hash.
|
58
87
|
#
|
59
|
-
# See http://www.elasticsearch.org/guide/reference/api/delete/
|
60
|
-
#
|
61
88
|
# params - Parameters Hash
|
89
|
+
# :id - the ID of the document to delete
|
90
|
+
#
|
91
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-delete.html
|
62
92
|
#
|
63
93
|
# Returns the response body as a Hash
|
64
94
|
def delete( params = {} )
|
@@ -69,9 +99,10 @@ module Elastomer
|
|
69
99
|
# Retrieve a document from the index based on its ID. The :id is
|
70
100
|
# provided as part of the params hash.
|
71
101
|
#
|
72
|
-
# See http://www.elasticsearch.org/guide/reference/api/get/
|
73
|
-
#
|
74
102
|
# params - Parameters Hash
|
103
|
+
# :id - the ID of the document to get
|
104
|
+
#
|
105
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html#docs-get
|
75
106
|
#
|
76
107
|
# Returns the response body as a Hash
|
77
108
|
def get( params = {} )
|
@@ -79,12 +110,28 @@ module Elastomer
|
|
79
110
|
response.body
|
80
111
|
end
|
81
112
|
|
113
|
+
# Check to see if a document exists. The :id is provided as part of the
|
114
|
+
# params hash.
|
115
|
+
#
|
116
|
+
# params - Parameters Hash
|
117
|
+
# :id - the ID of the document to check
|
118
|
+
#
|
119
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html#docs-get
|
120
|
+
#
|
121
|
+
# Returns true if the document exists
|
122
|
+
def exists?( params = {} )
|
123
|
+
response = client.head '/{index}/{type}/{id}', update_params(params, :action => 'docs.exists')
|
124
|
+
response.success?
|
125
|
+
end
|
126
|
+
alias_method :exist?, :exists?
|
127
|
+
|
82
128
|
# Retrieve the document source from the index based on the ID and type.
|
83
129
|
# The :id is provided as part of the params hash.
|
84
130
|
#
|
85
|
-
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html#_source
|
86
|
-
#
|
87
131
|
# params - Parameters Hash
|
132
|
+
# :id - the ID of the document
|
133
|
+
#
|
134
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html#_source
|
88
135
|
#
|
89
136
|
# Returns the response body as a Hash
|
90
137
|
def source( params = {} )
|
@@ -93,29 +140,32 @@ module Elastomer
|
|
93
140
|
end
|
94
141
|
|
95
142
|
# Allows to get multiple documents based on an index, type, and id (and possibly routing).
|
96
|
-
# See http://www.elasticsearch.org/guide/reference/api/multi-get/
|
97
143
|
#
|
98
|
-
#
|
144
|
+
# body - The request body as a Hash or a JSON encoded String
|
99
145
|
# params - Parameters Hash
|
100
146
|
#
|
147
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-multi-get.html
|
148
|
+
#
|
101
149
|
# Returns the response body as a Hash
|
102
|
-
def multi_get(
|
103
|
-
overrides = from_document
|
150
|
+
def multi_get( body, params = {} )
|
151
|
+
overrides = from_document body
|
104
152
|
overrides[:action] = 'docs.multi_get'
|
105
153
|
|
106
|
-
response = client.get '{/index}{/type}
|
154
|
+
response = client.get '{/index}{/type}/_mget', update_params(params, overrides)
|
107
155
|
response.body
|
108
156
|
end
|
157
|
+
alias_method :mget, :multi_get
|
109
158
|
|
110
159
|
# Update a document based on a script provided.
|
111
|
-
# See http://www.elasticsearch.org/guide/reference/api/update/
|
112
160
|
#
|
113
161
|
# script - The script (as a Hash) used to update the document in place
|
114
162
|
# params - Parameters Hash
|
115
163
|
#
|
164
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-update.html
|
165
|
+
#
|
116
166
|
# Returns the response body as a Hash
|
117
167
|
def update( script, params = {} )
|
118
|
-
overrides = from_document
|
168
|
+
overrides = from_document script
|
119
169
|
overrides[:action] = 'docs.update'
|
120
170
|
|
121
171
|
response = client.post '/{index}/{type}/{id}/_update', update_params(params, overrides)
|
@@ -128,8 +178,6 @@ module Elastomer
|
|
128
178
|
# the query hash must contain the :query key. Otherwise we assume a URI
|
129
179
|
# request is being made.
|
130
180
|
#
|
131
|
-
# See http://www.elasticsearch.org/guide/reference/api/search/
|
132
|
-
#
|
133
181
|
# query - The query body as a Hash
|
134
182
|
# params - Parameters Hash
|
135
183
|
#
|
@@ -141,6 +189,10 @@ module Elastomer
|
|
141
189
|
# # same thing but using the URI request method
|
142
190
|
# search(:q => '*:*', :type => 'tweet')
|
143
191
|
#
|
192
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-search.html
|
193
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-uri-request.html
|
194
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-body.html
|
195
|
+
#
|
144
196
|
# Returns the response body as a hash
|
145
197
|
def search( query, params = nil )
|
146
198
|
query, params = extract_params(query) if params.nil?
|
@@ -149,14 +201,30 @@ module Elastomer
|
|
149
201
|
response.body
|
150
202
|
end
|
151
203
|
|
204
|
+
# The search shards API returns the indices and shards that a search
|
205
|
+
# request would be executed against. This can give useful feedback for
|
206
|
+
# working out issues or planning optimizations with routing and shard
|
207
|
+
# preferences.
|
208
|
+
#
|
209
|
+
# params - Parameters Hash
|
210
|
+
# :routing - routing values
|
211
|
+
# :preference - which shard replicas to execute the search request on
|
212
|
+
# :local - boolean value to use local cluster state
|
213
|
+
#
|
214
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-shards.html
|
215
|
+
#
|
216
|
+
# Returns the response body as a hash
|
217
|
+
def search_shards( params = {} )
|
218
|
+
response = client.get '/{index}{/type}/_search_shards', update_params(params, :action => 'docs.search_shards')
|
219
|
+
response.body
|
220
|
+
end
|
221
|
+
|
152
222
|
# Executes a search query, but instead of returning results, returns
|
153
223
|
# the number of documents matched. This method supports both the
|
154
224
|
# "request body" query and the "URI request" query. When using the
|
155
225
|
# request body semantics, the query hash must contain the :query key.
|
156
226
|
# Otherwise we assume a URI request is being made.
|
157
227
|
#
|
158
|
-
# See http://www.elasticsearch.org/guide/reference/api/count/
|
159
|
-
#
|
160
228
|
# query - The query body as a Hash
|
161
229
|
# params - Parameters Hash
|
162
230
|
#
|
@@ -168,11 +236,13 @@ module Elastomer
|
|
168
236
|
# # same thing but using the URI request method
|
169
237
|
# count(:q => '*:*', :type => 'tweet')
|
170
238
|
#
|
239
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-count.html
|
240
|
+
#
|
171
241
|
# Returns the response body as a Hash
|
172
|
-
def count(query, params = nil)
|
242
|
+
def count( query, params = nil )
|
173
243
|
query, params = extract_params(query) if params.nil?
|
174
244
|
|
175
|
-
response = client.get '/{index}{/type}/_count', update_params(params, :body => query)
|
245
|
+
response = client.get '/{index}{/type}/_count', update_params(params, :body => query, :action => 'docs.count')
|
176
246
|
response.body
|
177
247
|
end
|
178
248
|
|
@@ -182,8 +252,6 @@ module Elastomer
|
|
182
252
|
# hash must contain the :query key. Otherwise we assume a URI request is
|
183
253
|
# being made.
|
184
254
|
#
|
185
|
-
# See http://www.elasticsearch.org/guide/reference/api/delete-by-query/
|
186
|
-
#
|
187
255
|
# query - The query body as a Hash
|
188
256
|
# params - Parameters Hash
|
189
257
|
#
|
@@ -195,6 +263,8 @@ module Elastomer
|
|
195
263
|
# # same thing but using the URI request method
|
196
264
|
# delete_by_query(:q => '*:*', :type => 'tweet')
|
197
265
|
#
|
266
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-delete-by-query.html
|
267
|
+
#
|
198
268
|
# Returns the response body as a hash
|
199
269
|
def delete_by_query( query, params = nil )
|
200
270
|
query, params = extract_params(query) if params.nil?
|
@@ -203,6 +273,40 @@ module Elastomer
|
|
203
273
|
response.body
|
204
274
|
end
|
205
275
|
|
276
|
+
# Returns information and statistics on terms in the fields of a
|
277
|
+
# particular document as stored in the index. The :id is provided as part
|
278
|
+
# of the params hash.
|
279
|
+
#
|
280
|
+
# params - Parameters Hash
|
281
|
+
# :id - the ID of the document to get
|
282
|
+
#
|
283
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-termvectors.html
|
284
|
+
#
|
285
|
+
# Returns the response body as a hash
|
286
|
+
def termvector( params = {} )
|
287
|
+
response = client.get '/{index}/{type}/{id}/_termvector', update_params(params, :action => 'docs.termvector')
|
288
|
+
response.body
|
289
|
+
end
|
290
|
+
alias_method :termvectors, :termvector
|
291
|
+
alias_method :term_vector, :termvector
|
292
|
+
alias_method :term_vectors, :termvector
|
293
|
+
|
294
|
+
# Multi termvectors API allows you to get multiple termvectors based on
|
295
|
+
# an index, type and id. The response includes a docs array with all the
|
296
|
+
# fetched termvectors, each element having the structure provided by the
|
297
|
+
# `termvector` API.
|
298
|
+
#
|
299
|
+
# params - Parameters Hash
|
300
|
+
#
|
301
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-multi-termvectors.html
|
302
|
+
#
|
303
|
+
# Returns the response body as a hash
|
304
|
+
def multi_termvectors( body, params = {} )
|
305
|
+
response = client.get '{/index}{/type}/_mtermvectors', update_params(params, :body => body, :action => 'docs.multi_termvectors')
|
306
|
+
response.body
|
307
|
+
end
|
308
|
+
alias_method :multi_term_vectors, :multi_termvectors
|
309
|
+
|
206
310
|
=begin
|
207
311
|
Percolate
|
208
312
|
=end
|
@@ -213,9 +317,8 @@ Percolate
|
|
213
317
|
# in the query body, but other fields like :size and :facets are
|
214
318
|
# allowed.
|
215
319
|
#
|
216
|
-
# See http://www.elasticsearch.org/guide/reference/api/more-like-this/
|
217
|
-
#
|
218
320
|
# params - Parameters Hash
|
321
|
+
# :id - the ID of the document
|
219
322
|
#
|
220
323
|
# Examples
|
221
324
|
#
|
@@ -225,8 +328,10 @@ Percolate
|
|
225
328
|
# more_like_this({:from => 5, :size => 10}, :mlt_fields => "title",
|
226
329
|
# :min_term_freq => 1, :type => "doc1", :id => 1)
|
227
330
|
#
|
331
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-more-like-this.html
|
332
|
+
#
|
228
333
|
# Returns the response body as a hash
|
229
|
-
def more_like_this(query, params = nil)
|
334
|
+
def more_like_this( query, params = nil )
|
230
335
|
query, params = extract_params(query) if params.nil?
|
231
336
|
|
232
337
|
response = client.get '/{index}/{type}/{id}/_mlt', update_params(params, :body => query, :action => 'docs.more_like_this')
|
@@ -237,10 +342,9 @@ Percolate
|
|
237
342
|
# can give useful feedback about why a document matched or didn't match
|
238
343
|
# a query. The document :id is provided as part of the params hash.
|
239
344
|
#
|
240
|
-
# See http://www.elasticsearch.org/guide/reference/api/explain/
|
241
|
-
#
|
242
345
|
# query - The query body as a Hash
|
243
346
|
# params - Parameters Hash
|
347
|
+
# :id - the ID of the document
|
244
348
|
#
|
245
349
|
# Examples
|
246
350
|
#
|
@@ -248,8 +352,10 @@ Percolate
|
|
248
352
|
#
|
249
353
|
# explain(:q => "message:search", :id => 1)
|
250
354
|
#
|
355
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-explain.html
|
356
|
+
#
|
251
357
|
# Returns the response body as a hash
|
252
|
-
def explain(query, params = nil)
|
358
|
+
def explain( query, params = nil )
|
253
359
|
query, params = extract_params(query) if params.nil?
|
254
360
|
|
255
361
|
response = client.get '/{index}/{type}/{id}/_explain', update_params(params, :body => query, :action => 'docs.explain')
|
@@ -260,21 +366,21 @@ Percolate
|
|
260
366
|
# :explain parameter can be used to get detailed information about
|
261
367
|
# why a query failed.
|
262
368
|
#
|
263
|
-
# See http://www.elasticsearch.org/guide/reference/api/validate/
|
264
|
-
#
|
265
369
|
# query - The query body as a Hash
|
266
370
|
# params - Parameters Hash
|
267
371
|
#
|
268
372
|
# Examples
|
269
373
|
#
|
270
374
|
# # request body query
|
271
|
-
# validate(:query_string => {:query => "*:*"})
|
375
|
+
# validate({:query => {:query_string => {:query => "*:*"}}}, :explain => true)
|
272
376
|
#
|
273
377
|
# # same thing but using the URI query parameter
|
274
|
-
# validate(
|
378
|
+
# validate(:q => "post_date:foo", :explain => true)
|
379
|
+
#
|
380
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-validate.html
|
275
381
|
#
|
276
382
|
# Returns the response body as a hash
|
277
|
-
def validate(query, params = nil)
|
383
|
+
def validate( query, params = nil )
|
278
384
|
query, params = extract_params(query) if params.nil?
|
279
385
|
|
280
386
|
response = client.get '/{index}{/type}/_validate/query', update_params(params, :body => query, :action => 'docs.validate')
|
@@ -309,8 +415,37 @@ Percolate
|
|
309
415
|
client.bulk params, &block
|
310
416
|
end
|
311
417
|
|
312
|
-
# Create a new
|
313
|
-
# The
|
418
|
+
# Create a new Scroller instance for scrolling all results from a `query`.
|
419
|
+
# The Scroller will be scoped to the current index and document type.
|
420
|
+
#
|
421
|
+
# query - The query to scroll as a Hash or a JSON encoded String
|
422
|
+
# opts - Options Hash
|
423
|
+
# :index - the name of the index to search
|
424
|
+
# :type - the document type to search
|
425
|
+
# :scroll - the keep alive time of the scrolling request (5 minutes by default)
|
426
|
+
# :size - the number of documents per shard to fetch per scroll
|
427
|
+
#
|
428
|
+
# Examples
|
429
|
+
#
|
430
|
+
# scroll = index.scroll('{"query":{"match_all":{}},"sort":{"date":"desc"}}')
|
431
|
+
# scroll.each_document do |document|
|
432
|
+
# document['_id']
|
433
|
+
# document['_source']
|
434
|
+
# end
|
435
|
+
#
|
436
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/scan-scroll.html
|
437
|
+
#
|
438
|
+
# Returns a new Scroller instance
|
439
|
+
def scroll( query, opts = {} )
|
440
|
+
opts = {:index => name, :type => type}.merge opts
|
441
|
+
client.scroll query, opts
|
442
|
+
end
|
443
|
+
|
444
|
+
# Create a new Scroller instance for scanning all results from a `query`.
|
445
|
+
# The Scroller will be scoped to the current index and document type. The
|
446
|
+
# Scroller is configured to use `scan` semantics which are more efficient
|
447
|
+
# than a standard scroll query; the caveat is that the returned documents
|
448
|
+
# cannot be sorted.
|
314
449
|
#
|
315
450
|
# query - The query to scan as a Hash or a JSON encoded String
|
316
451
|
# opts - Options Hash
|
@@ -327,7 +462,7 @@ Percolate
|
|
327
462
|
# document['_source']
|
328
463
|
# end
|
329
464
|
#
|
330
|
-
# Returns a new
|
465
|
+
# Returns a new Scroller instance
|
331
466
|
def scan( query, opts = {} )
|
332
467
|
opts = {:index => name, :type => type}.merge opts
|
333
468
|
client.scan query, opts
|
@@ -338,8 +473,6 @@ Percolate
|
|
338
473
|
# and document type will be passed to the multi_search API call as
|
339
474
|
# part of the request parameters.
|
340
475
|
#
|
341
|
-
# See http://www.elasticsearch.org/guide/reference/api/multi-search/
|
342
|
-
#
|
343
476
|
# params - Parameters Hash that will be passed to the API call.
|
344
477
|
# block - Required block that is used to accumulate searches.
|
345
478
|
# All the operations will be passed to the search cluster
|
@@ -356,14 +489,19 @@ Percolate
|
|
356
489
|
# ...
|
357
490
|
# end
|
358
491
|
#
|
492
|
+
# See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-multi-search.html
|
493
|
+
#
|
359
494
|
# Returns the response body as a Hash
|
360
|
-
def multi_search(params = {}, &block)
|
495
|
+
def multi_search( params = {}, &block )
|
361
496
|
raise 'a block is required' if block.nil?
|
362
497
|
|
363
498
|
params = {:index => self.name, :type => self.type}.merge params
|
364
499
|
client.multi_search params, &block
|
365
500
|
end
|
366
501
|
|
502
|
+
SPECIAL_KEYS = %w[index type id version version_type op_type routing parent timestamp ttl consistency replication refresh].freeze
|
503
|
+
SPECIAL_KEYS_HASH = SPECIAL_KEYS.inject({}) { |h, k| h[k.to_sym] = "_#{k}"; h }.freeze
|
504
|
+
|
367
505
|
# Internal: Given a `document` generate an options hash that will
|
368
506
|
# override parameters based on the content of the document. The document
|
369
507
|
# will be returned as the value of the :body key.
|
@@ -377,10 +515,8 @@ Percolate
|
|
377
515
|
def from_document( document )
|
378
516
|
opts = {:body => document}
|
379
517
|
|
380
|
-
|
381
|
-
|
382
|
-
key = field.sub(/^_/, '').to_sym
|
383
|
-
|
518
|
+
if document.is_a? Hash
|
519
|
+
SPECIAL_KEYS_HASH.each do |key, field|
|
384
520
|
opts[key] = document.delete field if document.key? field
|
385
521
|
opts[key] = document.delete field.to_sym if document.key? field.to_sym
|
386
522
|
end
|
@@ -415,7 +551,7 @@ Percolate
|
|
415
551
|
# params - params hash OR nil if no query
|
416
552
|
#
|
417
553
|
# Returns an array of the query (possibly nil) and params Hash.
|
418
|
-
def extract_params(query, params=nil)
|
554
|
+
def extract_params( query, params = nil )
|
419
555
|
if params.nil?
|
420
556
|
if query.key? :query
|
421
557
|
params = {}
|
@@ -426,6 +562,6 @@ Percolate
|
|
426
562
|
[query, params]
|
427
563
|
end
|
428
564
|
|
429
|
-
end
|
430
|
-
end
|
431
|
-
end
|
565
|
+
end
|
566
|
+
end
|
567
|
+
end
|