elasticsearch-api 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +13 -0
- data/README.md +160 -0
- data/Rakefile +62 -0
- data/elasticsearch-api.gemspec +51 -0
- data/lib/elasticsearch-api +1 -0
- data/lib/elasticsearch/api.rb +23 -0
- data/lib/elasticsearch/api/actions/bulk.rb +71 -0
- data/lib/elasticsearch/api/actions/cluster/get_settings.rb +21 -0
- data/lib/elasticsearch/api/actions/cluster/health.rb +50 -0
- data/lib/elasticsearch/api/actions/cluster/node_hot_threads.rb +46 -0
- data/lib/elasticsearch/api/actions/cluster/node_info.rb +59 -0
- data/lib/elasticsearch/api/actions/cluster/node_shutdown.rb +36 -0
- data/lib/elasticsearch/api/actions/cluster/node_stats.rb +77 -0
- data/lib/elasticsearch/api/actions/cluster/put_settings.rb +28 -0
- data/lib/elasticsearch/api/actions/cluster/reroute.rb +44 -0
- data/lib/elasticsearch/api/actions/cluster/state.rb +47 -0
- data/lib/elasticsearch/api/actions/count.rb +46 -0
- data/lib/elasticsearch/api/actions/create.rb +34 -0
- data/lib/elasticsearch/api/actions/delete.rb +61 -0
- data/lib/elasticsearch/api/actions/delete_by_query.rb +62 -0
- data/lib/elasticsearch/api/actions/exists.rb +51 -0
- data/lib/elasticsearch/api/actions/explain.rb +71 -0
- data/lib/elasticsearch/api/actions/get.rb +59 -0
- data/lib/elasticsearch/api/actions/get_source.rb +59 -0
- data/lib/elasticsearch/api/actions/index.rb +81 -0
- data/lib/elasticsearch/api/actions/indices/analyze.rb +63 -0
- data/lib/elasticsearch/api/actions/indices/clear_cache.rb +69 -0
- data/lib/elasticsearch/api/actions/indices/close.rb +35 -0
- data/lib/elasticsearch/api/actions/indices/create.rb +83 -0
- data/lib/elasticsearch/api/actions/indices/delete.rb +48 -0
- data/lib/elasticsearch/api/actions/indices/delete_alias.rb +37 -0
- data/lib/elasticsearch/api/actions/indices/delete_mapping.rb +26 -0
- data/lib/elasticsearch/api/actions/indices/delete_template.rb +33 -0
- data/lib/elasticsearch/api/actions/indices/delete_warmer.rb +32 -0
- data/lib/elasticsearch/api/actions/indices/exists.rb +35 -0
- data/lib/elasticsearch/api/actions/indices/exists_alias.rb +41 -0
- data/lib/elasticsearch/api/actions/indices/exists_type.rb +39 -0
- data/lib/elasticsearch/api/actions/indices/flush.rb +40 -0
- data/lib/elasticsearch/api/actions/indices/get_alias.rb +41 -0
- data/lib/elasticsearch/api/actions/indices/get_aliases.rb +32 -0
- data/lib/elasticsearch/api/actions/indices/get_mapping.rb +36 -0
- data/lib/elasticsearch/api/actions/indices/get_settings.rb +32 -0
- data/lib/elasticsearch/api/actions/indices/get_template.rb +30 -0
- data/lib/elasticsearch/api/actions/indices/get_warmer.rb +44 -0
- data/lib/elasticsearch/api/actions/indices/open.rb +33 -0
- data/lib/elasticsearch/api/actions/indices/optimize.rb +57 -0
- data/lib/elasticsearch/api/actions/indices/put_alias.rb +43 -0
- data/lib/elasticsearch/api/actions/indices/put_mapping.rb +49 -0
- data/lib/elasticsearch/api/actions/indices/put_settings.rb +45 -0
- data/lib/elasticsearch/api/actions/indices/put_template.rb +40 -0
- data/lib/elasticsearch/api/actions/indices/put_warmer.rb +48 -0
- data/lib/elasticsearch/api/actions/indices/refresh.rb +43 -0
- data/lib/elasticsearch/api/actions/indices/segments.rb +33 -0
- data/lib/elasticsearch/api/actions/indices/snapshot_index.rb +32 -0
- data/lib/elasticsearch/api/actions/indices/stats.rb +96 -0
- data/lib/elasticsearch/api/actions/indices/status.rb +46 -0
- data/lib/elasticsearch/api/actions/indices/update_aliases.rb +49 -0
- data/lib/elasticsearch/api/actions/indices/validate_query.rb +68 -0
- data/lib/elasticsearch/api/actions/info.rb +19 -0
- data/lib/elasticsearch/api/actions/mget.rb +64 -0
- data/lib/elasticsearch/api/actions/mlt.rb +86 -0
- data/lib/elasticsearch/api/actions/msearch.rb +75 -0
- data/lib/elasticsearch/api/actions/percolate.rb +57 -0
- data/lib/elasticsearch/api/actions/ping.rb +29 -0
- data/lib/elasticsearch/api/actions/scroll.rb +44 -0
- data/lib/elasticsearch/api/actions/search.rb +145 -0
- data/lib/elasticsearch/api/actions/suggest.rb +46 -0
- data/lib/elasticsearch/api/actions/update.rb +103 -0
- data/lib/elasticsearch/api/namespace/cluster.rb +20 -0
- data/lib/elasticsearch/api/namespace/common.rb +27 -0
- data/lib/elasticsearch/api/namespace/indices.rb +20 -0
- data/lib/elasticsearch/api/utils.rb +97 -0
- data/lib/elasticsearch/api/version.rb +5 -0
- data/test/integration/yaml_test_runner.rb +330 -0
- data/test/test_helper.rb +52 -0
- data/test/unit/bulk_test.rb +85 -0
- data/test/unit/client_test.rb +31 -0
- data/test/unit/cluster/get_settings_test.rb +26 -0
- data/test/unit/cluster/health_test.rb +38 -0
- data/test/unit/cluster/node_hot_threads_test.rb +35 -0
- data/test/unit/cluster/node_info_test.rb +45 -0
- data/test/unit/cluster/node_shutdown_test.rb +45 -0
- data/test/unit/cluster/node_stats_test.rb +65 -0
- data/test/unit/cluster/put_settings_test.rb +26 -0
- data/test/unit/cluster/reroute_test.rb +38 -0
- data/test/unit/cluster/state_test.rb +37 -0
- data/test/unit/count_test.rb +46 -0
- data/test/unit/create_document_test.rb +38 -0
- data/test/unit/delete_by_query_test.rb +42 -0
- data/test/unit/delete_document_test.rb +62 -0
- data/test/unit/exists_document_test.rb +76 -0
- data/test/unit/explain_document_test.rb +64 -0
- data/test/unit/get_document_source_test.rb +62 -0
- data/test/unit/get_document_test.rb +62 -0
- data/test/unit/hashie_test.rb +78 -0
- data/test/unit/index_document_test.rb +77 -0
- data/test/unit/indices/analyze_test.rb +67 -0
- data/test/unit/indices/clear_cache_test.rb +45 -0
- data/test/unit/indices/close_test.rb +42 -0
- data/test/unit/indices/create_test.rb +42 -0
- data/test/unit/indices/delete_alias_test.rb +38 -0
- data/test/unit/indices/delete_mapping_test.rb +47 -0
- data/test/unit/indices/delete_template_test.rb +26 -0
- data/test/unit/indices/delete_test.rb +45 -0
- data/test/unit/indices/delete_warmer_test.rb +59 -0
- data/test/unit/indices/exists_alias_test.rb +65 -0
- data/test/unit/indices/exists_test.rb +57 -0
- data/test/unit/indices/exists_type_test.rb +59 -0
- data/test/unit/indices/flush_test.rb +45 -0
- data/test/unit/indices/get_alias_test.rb +41 -0
- data/test/unit/indices/get_aliases_test.rb +35 -0
- data/test/unit/indices/get_mapping_test.rb +53 -0
- data/test/unit/indices/get_settings_test.rb +35 -0
- data/test/unit/indices/get_template_test.rb +32 -0
- data/test/unit/indices/get_warmer_test.rb +41 -0
- data/test/unit/indices/open_test.rb +42 -0
- data/test/unit/indices/optimize_test.rb +45 -0
- data/test/unit/indices/put_alias_test.rb +47 -0
- data/test/unit/indices/put_mapping_test.rb +57 -0
- data/test/unit/indices/put_settings_test.rb +50 -0
- data/test/unit/indices/put_template_test.rb +48 -0
- data/test/unit/indices/put_warmer_test.rb +62 -0
- data/test/unit/indices/refresh_test.rb +55 -0
- data/test/unit/indices/segments_test.rb +55 -0
- data/test/unit/indices/snapshot_index_test.rb +55 -0
- data/test/unit/indices/stats_test.rb +76 -0
- data/test/unit/indices/status_test.rb +55 -0
- data/test/unit/indices/update_aliases_test.rb +42 -0
- data/test/unit/indices/validate_query_test.rb +75 -0
- data/test/unit/info_test.rb +26 -0
- data/test/unit/json_builders_test.rb +64 -0
- data/test/unit/mget_test.rb +70 -0
- data/test/unit/mlt_test.rb +80 -0
- data/test/unit/msearch_test.rb +120 -0
- data/test/unit/percolate_test.rb +49 -0
- data/test/unit/ping_test.rb +48 -0
- data/test/unit/scroll_test.rb +26 -0
- data/test/unit/search_test.rb +93 -0
- data/test/unit/suggest_test.rb +55 -0
- data/test/unit/update_document_test.rb +62 -0
- data/test/unit/utils_test.rb +118 -0
- metadata +498 -0
@@ -0,0 +1,145 @@
|
|
1
|
+
module Elasticsearch
|
2
|
+
module API
|
3
|
+
module Actions
|
4
|
+
|
5
|
+
# Return documents matching a query, as well as aggregations (facets), highlighted snippets, suggestions, etc.
|
6
|
+
#
|
7
|
+
# The search API is used to query one or more indices either using simple
|
8
|
+
# [query string queries](http://www.elasticsearch.org/guide/reference/api/search/uri-request/)
|
9
|
+
# as the `:q` argument , or by passing the
|
10
|
+
# [full request definition](http://www.elasticsearch.org/guide/reference/api/search/request-body/)
|
11
|
+
# in the [Query DSL](http://www.elasticsearch.org/guide/reference/query-dsl/) as the `:body` argument.
|
12
|
+
#
|
13
|
+
# @example Search with a simple query string query
|
14
|
+
#
|
15
|
+
# client.search index: 'myindex', q: 'title:test'
|
16
|
+
#
|
17
|
+
# @example Passing a full request definition in the Elasticsearch's Query DSL as a `Hash`
|
18
|
+
#
|
19
|
+
# client.search index: 'myindex',
|
20
|
+
# body: {
|
21
|
+
# query: { match: { title: 'test' } },
|
22
|
+
# facets: { tags: { terms: { field: 'tags' } } }
|
23
|
+
# }
|
24
|
+
#
|
25
|
+
# @example Passing the search definition as a `String`, built with a JSON builder
|
26
|
+
#
|
27
|
+
# require 'jbuilder'
|
28
|
+
#
|
29
|
+
# json = Jbuilder.encode do |json|
|
30
|
+
# json.query do
|
31
|
+
# json.match do
|
32
|
+
# json.title do
|
33
|
+
# json.query 'test 1'
|
34
|
+
# json.operator 'and'
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# client.search index: 'myindex', body: json
|
41
|
+
#
|
42
|
+
# @example Wrapping the result in [`Hashie::Mash`](https://github.com/intridea/hashie) for easier access
|
43
|
+
#
|
44
|
+
# response = client.search index: 'myindex',
|
45
|
+
# body: {
|
46
|
+
# query: { match: { title: 'test' } },
|
47
|
+
# facets: { tags: { terms: { field: 'tags' } } }
|
48
|
+
# }
|
49
|
+
#
|
50
|
+
# response = Hashie::Mash.new response
|
51
|
+
#
|
52
|
+
# response.hits.hits.first._source.title
|
53
|
+
#
|
54
|
+
# response.facets.tags.terms.to_a.map { |f| "#{f.term} [#{f.count}]" }.join(', ')
|
55
|
+
#
|
56
|
+
# @option arguments [List] :index A comma-separated list of index names to search; use `_all`
|
57
|
+
# or empty string to perform the operation on all indices
|
58
|
+
# @option arguments [List] :type A comma-separated list of document types to search;
|
59
|
+
# leave empty to perform the operation on all types
|
60
|
+
# @option arguments [Hash] :body The search definition using the Query DSL
|
61
|
+
# @option arguments [String] :analyzer The analyzer to use for the query string
|
62
|
+
# @option arguments [Boolean] :analyze_wildcard Specify whether wildcard and prefix queries should be analyzed
|
63
|
+
# (default: false)
|
64
|
+
# @option arguments [String] :default_operator The default operator for query string query (AND or OR)
|
65
|
+
# (options: AND, OR)
|
66
|
+
# @option arguments [String] :df The field to use as default where no field prefix is given in the query string
|
67
|
+
# @option arguments [Boolean] :explain Specify whether to return detailed information about score computation
|
68
|
+
# as part of a hit
|
69
|
+
# @option arguments [List] :fields A comma-separated list of fields to return as part of a hit
|
70
|
+
# @option arguments [Number] :from Starting offset (default: 0)
|
71
|
+
# @option arguments [String] :ignore_indices When performed on multiple indices, allows to ignore `missing` ones
|
72
|
+
# (options: none, missing)
|
73
|
+
# @option arguments [List] :indices_boost Comma-separated list of index boosts
|
74
|
+
# @option arguments [Boolean] :lenient Specify whether format-based query failures
|
75
|
+
# (such as providing text to a numeric field) should be ignored
|
76
|
+
# @option arguments [Boolean] :lowercase_expanded_terms Specify whether query terms should be lowercased
|
77
|
+
# @option arguments [String] :preference Specify the node or shard the operation should be performed on
|
78
|
+
# (default: random)
|
79
|
+
# @option arguments [String] :q Query in the Lucene query string syntax
|
80
|
+
# @option arguments [List] :routing A comma-separated list of specific routing values
|
81
|
+
# @option arguments [Duration] :scroll Specify how long a consistent view of the index should be maintained
|
82
|
+
# for scrolled search
|
83
|
+
# @option arguments [String] :search_type Search operation type (options: query_then_fetch, query_and_fetch,
|
84
|
+
# dfs_query_then_fetch, dfs_query_and_fetch, count, scan)
|
85
|
+
# @option arguments [Number] :size Number of hits to return (default: 10)
|
86
|
+
# @option arguments [List] :sort A comma-separated list of <field>:<direction> pairs
|
87
|
+
# @option arguments [String] :source The URL-encoded request definition using the Query DSL
|
88
|
+
# (instead of using request body)
|
89
|
+
# @option arguments [List] :stats Specific 'tag' of the request for logging and statistical purposes
|
90
|
+
# @option arguments [String] :suggest_field Specify which field to use for suggestions
|
91
|
+
# @option arguments [String] :suggest_mode Specify suggest mode (options: missing, popular, always)
|
92
|
+
# @option arguments [Number] :suggest_size How many suggestions to return in response
|
93
|
+
# @option arguments [Text] :suggest_text The source text for which the suggestions should be returned
|
94
|
+
# @option arguments [Time] :timeout Explicit operation timeout
|
95
|
+
# @option arguments [Boolean] :version Specify whether to return document version as part of a hit
|
96
|
+
#
|
97
|
+
# @return [Hash]
|
98
|
+
#
|
99
|
+
# @see http://www.elasticsearch.org/guide/reference/api/search/
|
100
|
+
# @see http://www.elasticsearch.org/guide/reference/api/search/request-body/
|
101
|
+
#
|
102
|
+
def search(arguments={})
|
103
|
+
arguments[:index] = '_all' if ! arguments[:index] && arguments[:type]
|
104
|
+
|
105
|
+
method = 'GET'
|
106
|
+
path = Utils.__pathify( Utils.__listify(arguments[:index]), Utils.__listify(arguments[:type]), '_search' )
|
107
|
+
params = arguments.select do |k,v|
|
108
|
+
[ :analyzer,
|
109
|
+
:analyze_wildcard,
|
110
|
+
:default_operator,
|
111
|
+
:df,
|
112
|
+
:explain,
|
113
|
+
:fields,
|
114
|
+
:from,
|
115
|
+
:ignore_indices,
|
116
|
+
:indices_boost,
|
117
|
+
:lenient,
|
118
|
+
:lowercase_expanded_terms,
|
119
|
+
:preference,
|
120
|
+
:q,
|
121
|
+
:routing,
|
122
|
+
:scroll,
|
123
|
+
:search_type,
|
124
|
+
:size,
|
125
|
+
:sort,
|
126
|
+
:source,
|
127
|
+
:stats,
|
128
|
+
:suggest_field,
|
129
|
+
:suggest_mode,
|
130
|
+
:suggest_size,
|
131
|
+
:suggest_text,
|
132
|
+
:timeout,
|
133
|
+
:version ].include?(k)
|
134
|
+
end
|
135
|
+
# Normalize Ruby 1.8 and Ruby 1.9 Hash#select behaviour
|
136
|
+
params = Hash[params] unless params.is_a?(Hash)
|
137
|
+
body = arguments[:body]
|
138
|
+
|
139
|
+
params[:fields] = Utils.__listify(params[:fields]) if params[:fields]
|
140
|
+
|
141
|
+
perform_request(method, path, params, body).body
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Elasticsearch
|
2
|
+
module API
|
3
|
+
module Actions
|
4
|
+
|
5
|
+
# Return query terms suggestions based on provided text and configuration.
|
6
|
+
#
|
7
|
+
# Pass the request definition in the `:body` argument.
|
8
|
+
#
|
9
|
+
# @example Return query terms suggestions ("auto-correction")
|
10
|
+
#
|
11
|
+
# client.suggest index: 'myindex',
|
12
|
+
# body: { my_suggest: { text: 'tset', term: { field: 'title' } } }
|
13
|
+
# # => { ... "my_suggest"=>[ {"text"=>"tset", ... "options"=>[{"text"=>"test", "score"=>0.75, "freq"=>5}] }]}
|
14
|
+
#
|
15
|
+
# @option arguments [List] :index A comma-separated list of index names to restrict the operation;
|
16
|
+
# use `_all` or empty string to perform the operation on all indices
|
17
|
+
# @option arguments [Hash] :body The request definition
|
18
|
+
# @option arguments [String] :ignore_indices When performed on multiple indices, allows to ignore `missing` ones
|
19
|
+
# (options: none, missing)
|
20
|
+
# @option arguments [String] :preference Specify the node or shard the operation should be performed on
|
21
|
+
# (default: random)
|
22
|
+
# @option arguments [String] :routing Specific routing value
|
23
|
+
# @option arguments [String] :source The URL-encoded request definition (instead of using request body)
|
24
|
+
#
|
25
|
+
# @since 0.90
|
26
|
+
#
|
27
|
+
# @see http://elasticsearch.org/guide/reference/api/search/suggest/
|
28
|
+
#
|
29
|
+
def suggest(arguments={})
|
30
|
+
method = 'POST'
|
31
|
+
path = Utils.__pathify( Utils.__listify(arguments[:index]), '_suggest' )
|
32
|
+
params = arguments.select do |k,v|
|
33
|
+
[ :ignore_indices,
|
34
|
+
:preference,
|
35
|
+
:routing,
|
36
|
+
:source ].include?(k)
|
37
|
+
end
|
38
|
+
# Normalize Ruby 1.8 and Ruby 1.9 Hash#select behaviour
|
39
|
+
params = Hash[params] unless params.is_a?(Hash)
|
40
|
+
body = arguments[:body]
|
41
|
+
|
42
|
+
perform_request(method, path, params, body).body
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module Elasticsearch
|
2
|
+
module API
|
3
|
+
module Actions
|
4
|
+
|
5
|
+
# Update a document without sending the whole document in the request ("partial update").
|
6
|
+
#
|
7
|
+
# Send either a partial document (`doc` ) which will be deeply merged into an existing document,
|
8
|
+
# or a `script`, which will update the document content, in the `:body` argument.
|
9
|
+
#
|
10
|
+
# The partial update operation allows you to limit the amount of data you send over the wire and
|
11
|
+
# reduces the chance of failed updates due to conflict.
|
12
|
+
#
|
13
|
+
# Specify the `:version` and `:retry_on_conflict` arguments to balance convenience and consistency.
|
14
|
+
#
|
15
|
+
# @example Update document _title_ using partial `doc`-ument
|
16
|
+
#
|
17
|
+
# client.update index: 'myindex', type: 'mytype', id: '1',
|
18
|
+
# body: { doc: { title: 'Updated' } }
|
19
|
+
#
|
20
|
+
# @example Add a tag to document `tags` property using a `script`
|
21
|
+
#
|
22
|
+
# client.update index: 'myindex', type: 'mytype', id: '1',
|
23
|
+
# body: { script: 'ctx._source.tags += tag', params: { tag: 'x' } }
|
24
|
+
#
|
25
|
+
# @example Increment a document counter by 1 _or_ initialize it, when the document does not exist
|
26
|
+
#
|
27
|
+
# client.update index: 'myindex', type: 'mytype', id: '666',
|
28
|
+
# body: { script: 'ctx._source.counter += 1', upsert: { counter: 1 } }
|
29
|
+
#
|
30
|
+
# @example Delete a document if it's tagged "to-delete"
|
31
|
+
#
|
32
|
+
# client.update index: 'myindex', type: 'mytype', id: '1',
|
33
|
+
# body: { script: 'ctx._source.tags.contains(tag) ? ctx.op = "delete" : ctx.op = "none"',
|
34
|
+
# params: { tag: 'to-delete' } }
|
35
|
+
#
|
36
|
+
# @option arguments [String] :id Document ID (*Required*)
|
37
|
+
# @option arguments [Number,List] :ignore The list of HTTP errors to ignore; only `404` supported at the moment
|
38
|
+
# @option arguments [String] :index The name of the index (*Required*)
|
39
|
+
# @option arguments [String] :type The type of the document (*Required*)
|
40
|
+
# @option arguments [Hash] :body The request definition using either `script` or partial `doc` (*Required*)
|
41
|
+
# @option arguments [String] :consistency Explicit write consistency setting for the operation
|
42
|
+
# (options: one, quorum, all)
|
43
|
+
# @option arguments [List] :fields A comma-separated list of fields to return in the response
|
44
|
+
# @option arguments [String] :lang The script language (default: mvel)
|
45
|
+
# @option arguments [String] :parent ID of the parent document
|
46
|
+
# @option arguments [String] :percolate Perform percolation during the operation;
|
47
|
+
# use specific registered query name, attribute, or wildcard
|
48
|
+
# @option arguments [Boolean] :refresh Refresh the index after performing the operation
|
49
|
+
# @option arguments [String] :replication Specific replication type (options: sync, async)
|
50
|
+
# @option arguments [Number] :retry_on_conflict Specify how many times should the operation be retried
|
51
|
+
# when a conflict occurs (default: 0)
|
52
|
+
# @option arguments [String] :routing Specific routing value
|
53
|
+
# @option arguments [String] :script The URL-encoded script definition (instead of using request body)
|
54
|
+
# @option arguments [Time] :timeout Explicit operation timeout
|
55
|
+
# @option arguments [Time] :timestamp Explicit timestamp for the document
|
56
|
+
# @option arguments [Duration] :ttl Expiration time for the document
|
57
|
+
# @option arguments [Number] :version Explicit version number for concurrency control
|
58
|
+
# @option arguments [Number] :version_type Explicit version number for concurrency control
|
59
|
+
#
|
60
|
+
# @since 0.20
|
61
|
+
#
|
62
|
+
# @see http://elasticsearch.org/guide/reference/api/update/
|
63
|
+
#
|
64
|
+
def update(arguments={})
|
65
|
+
raise ArgumentError, "Required argument 'index' missing" unless arguments[:index]
|
66
|
+
raise ArgumentError, "Required argument 'type' missing" unless arguments[:type]
|
67
|
+
raise ArgumentError, "Required argument 'id' missing" unless arguments[:id]
|
68
|
+
method = 'POST'
|
69
|
+
path = Utils.__pathify( arguments[:index], arguments[:type], arguments[:id], '_update' )
|
70
|
+
params = arguments.select do |k,v|
|
71
|
+
[ :consistency,
|
72
|
+
:fields,
|
73
|
+
:lang,
|
74
|
+
:parent,
|
75
|
+
:percolate,
|
76
|
+
:refresh,
|
77
|
+
:replication,
|
78
|
+
:retry_on_conflict,
|
79
|
+
:routing,
|
80
|
+
:script,
|
81
|
+
:timeout,
|
82
|
+
:timestamp,
|
83
|
+
:ttl,
|
84
|
+
:version,
|
85
|
+
:version_type ].include?(k)
|
86
|
+
end
|
87
|
+
# Normalize Ruby 1.8 and Ruby 1.9 Hash#select behaviour
|
88
|
+
params = Hash[params] unless params.is_a?(Hash)
|
89
|
+
body = arguments[:body]
|
90
|
+
|
91
|
+
params[:fields] = Utils.__listify(params[:fields]) if params[:fields]
|
92
|
+
|
93
|
+
perform_request(method, path, params, body).body
|
94
|
+
|
95
|
+
rescue Exception => e
|
96
|
+
# NOTE: Use exception name, not full class in Elasticsearch::Client to allow client plugability
|
97
|
+
if arguments[:ignore] == 404 && e.class.to_s =~ /NotFound/; false
|
98
|
+
else raise(e)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Elasticsearch
|
2
|
+
module API
|
3
|
+
module Cluster
|
4
|
+
module Actions; end
|
5
|
+
|
6
|
+
# Client for the "cluster" namespace (includes the {Cluster::Actions} methods)
|
7
|
+
#
|
8
|
+
class ClusterClient
|
9
|
+
include Common::Client, Common::Client::Base, Cluster::Actions
|
10
|
+
end
|
11
|
+
|
12
|
+
# Proxy method for {ClusterClient}, available in the receiving object
|
13
|
+
#
|
14
|
+
def cluster
|
15
|
+
@cluster ||= ClusterClient.new(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Elasticsearch
|
2
|
+
module API
|
3
|
+
module Common
|
4
|
+
module Actions; end
|
5
|
+
|
6
|
+
module Client
|
7
|
+
|
8
|
+
# Base client wrapper
|
9
|
+
#
|
10
|
+
module Base
|
11
|
+
attr_reader :client
|
12
|
+
|
13
|
+
def initialize(client)
|
14
|
+
@client = client
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Delegates the `perform_request` method to the wrapped client
|
19
|
+
#
|
20
|
+
def perform_request(method, path, params={}, body=nil)
|
21
|
+
client.perform_request method, path, params, body
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Elasticsearch
|
2
|
+
module API
|
3
|
+
module Indices
|
4
|
+
module Actions; end
|
5
|
+
|
6
|
+
# Client for the "indices" namespace (includes the {Indices::Actions} methods)
|
7
|
+
#
|
8
|
+
class IndicesClient
|
9
|
+
include Common::Client, Common::Client::Base, Indices::Actions
|
10
|
+
end
|
11
|
+
|
12
|
+
# Proxy method for {IndicesClient}, available in the receiving object
|
13
|
+
#
|
14
|
+
def indices
|
15
|
+
@indices ||= IndicesClient.new(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Elasticsearch
|
2
|
+
module API
|
3
|
+
|
4
|
+
# Generic utility methods
|
5
|
+
#
|
6
|
+
module Utils
|
7
|
+
|
8
|
+
# URL-escape a string
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# __escape('bar^bam') # => 'bar%5Ebam'
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
def __escape(string)
|
15
|
+
URI.encode(string.to_s)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Create a "list" of values from arguments, ignoring nil values
|
19
|
+
#
|
20
|
+
# @example Create a list from array
|
21
|
+
# __listify(['A','B']) # => 'A,B'
|
22
|
+
#
|
23
|
+
# @example Create a list from arguments
|
24
|
+
# __listify('A','B') # => 'A,B'
|
25
|
+
#
|
26
|
+
# @api private
|
27
|
+
def __listify(*list)
|
28
|
+
Array(list).flatten.compact.join(',')
|
29
|
+
end
|
30
|
+
|
31
|
+
# Create a path (URL part) from arguments, ignoring nil values and empty strings,
|
32
|
+
# and encoding special characters
|
33
|
+
#
|
34
|
+
# @example Create a path from array
|
35
|
+
# __pathify(['foo', '', nil, 'bar']) # => 'foo/bar'
|
36
|
+
#
|
37
|
+
# @example Create a path from arguments
|
38
|
+
# __pathify('foo', '', nil, 'bar') # => 'foo/bar'
|
39
|
+
#
|
40
|
+
# # @example Encode special characters
|
41
|
+
# __pathify(['foo', 'bar^bam']) # => 'foo/bar%5Ebam'
|
42
|
+
#
|
43
|
+
# @api private
|
44
|
+
def __pathify(*segments)
|
45
|
+
Array(segments).flatten.
|
46
|
+
compact.
|
47
|
+
reject { |s| s.to_s =~ /^\s*$/ }.
|
48
|
+
map { |s| __escape(s) }.
|
49
|
+
join('/').
|
50
|
+
squeeze('/')
|
51
|
+
end
|
52
|
+
|
53
|
+
# Convert an array of payloads into Elasticsearch `header\ndata` format
|
54
|
+
#
|
55
|
+
# Elasticsearch::API::Utils.__bulkify [
|
56
|
+
# { :index => { :_index => 'myindexA', :_type => 'mytype', :_id => '1', :data => { :title => 'Test' } } },
|
57
|
+
# { :update => { :_index => 'myindexB', :_type => 'mytype', :_id => '2', :data => { :doc => { :title => 'Update' } } } }
|
58
|
+
# ]
|
59
|
+
#
|
60
|
+
# # => {"index":{"_index":"myindexA","_type":"mytype","_id":"1"}}
|
61
|
+
# # => {"title":"Test"}
|
62
|
+
# # => {"update":{"_index":"myindexB","_type":"mytype","_id":"2"}}
|
63
|
+
# # => {"doc":{"title":"Update"}}
|
64
|
+
#
|
65
|
+
def __bulkify(payload)
|
66
|
+
case
|
67
|
+
# Hashes with `:data`
|
68
|
+
when payload.any? { |d| d.is_a?(Hash) && d.values.first.is_a?(Hash) && (d.values.first[:data] || d.values.first['data']) }
|
69
|
+
payload = payload.
|
70
|
+
inject([]) do |sum, item|
|
71
|
+
operation, meta = item.to_a.first
|
72
|
+
data = meta.delete(:data) || meta.delete('data')
|
73
|
+
|
74
|
+
sum << { operation => meta }
|
75
|
+
sum << data if data
|
76
|
+
sum
|
77
|
+
end.
|
78
|
+
map { |item| MultiJson.dump(item) }
|
79
|
+
payload << "" unless payload.empty?
|
80
|
+
|
81
|
+
# Array of strings
|
82
|
+
when payload.all? { |d| d.is_a? String }
|
83
|
+
payload << ''
|
84
|
+
|
85
|
+
# Header/Data pairs
|
86
|
+
else
|
87
|
+
payload = payload.map { |item| MultiJson.dump(item) }
|
88
|
+
payload << ''
|
89
|
+
end
|
90
|
+
|
91
|
+
payload = payload.join("\n")
|
92
|
+
end
|
93
|
+
|
94
|
+
extend self
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|