elastic-enterprise-search 0.3.0 → 7.13.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.ci/.gitignore +1 -0
  3. data/.ci/Dockerfile +12 -0
  4. data/.ci/certs/README.md +50 -0
  5. data/.ci/certs/ca.crt +20 -0
  6. data/.ci/certs/ca.key +27 -0
  7. data/.ci/certs/testnode.crt +21 -0
  8. data/.ci/certs/testnode.key +27 -0
  9. data/.ci/certs/testnode_no_san.crt +19 -0
  10. data/.ci/certs/testnode_no_san.key +27 -0
  11. data/.ci/functions/cleanup.sh +67 -0
  12. data/.ci/functions/imports.sh +59 -0
  13. data/.ci/functions/wait-for-container.sh +36 -0
  14. data/.ci/jobs/defaults.yml +69 -0
  15. data/.ci/jobs/elastic+enterprise-search-ruby+7.10.0.beta.1.yml +12 -0
  16. data/.ci/jobs/elastic+enterprise-search-ruby+master.yml +12 -0
  17. data/.ci/jobs/elastic+enterprise-search-ruby+pull-request.yml +19 -0
  18. data/.ci/run-elasticsearch.sh +127 -0
  19. data/.ci/run-enterprise-search.sh +71 -0
  20. data/.ci/run-local.sh +14 -0
  21. data/.ci/run-repository.sh +49 -0
  22. data/.ci/run-tests +27 -0
  23. data/.ci/test-matrix.yml +14 -0
  24. data/.github/workflows/rubocop.yml +15 -0
  25. data/.github/workflows/testing.yml +40 -0
  26. data/.gitignore +4 -0
  27. data/.rubocop.yml +52 -0
  28. data/CONTRIBUTING.md +43 -0
  29. data/Gemfile +23 -1
  30. data/{LICENSE.txt → LICENSE} +33 -32
  31. data/README.md +27 -147
  32. data/Rakefile +48 -1
  33. data/docs/guide/app-search-api.asciidoc +186 -0
  34. data/docs/guide/connecting.asciidoc +171 -0
  35. data/docs/guide/development.asciidoc +42 -0
  36. data/docs/guide/enterprise-search-api.asciidoc +46 -0
  37. data/docs/guide/index.asciidoc +19 -0
  38. data/docs/guide/installation.asciidoc +18 -0
  39. data/docs/guide/overview.asciidoc +59 -0
  40. data/docs/guide/release_notes/710.asciidoc +4 -0
  41. data/docs/guide/release_notes/711.asciidoc +27 -0
  42. data/docs/guide/release_notes/712.asciidoc +16 -0
  43. data/docs/guide/release_notes/index.asciidoc +14 -0
  44. data/docs/guide/workplace-search-api.asciidoc +138 -0
  45. data/elastic-enterprise-search.gemspec +49 -12
  46. data/lib/elastic-enterprise-search.rb +20 -1
  47. data/lib/elastic/.rubocop.yml +6 -0
  48. data/lib/elastic/app-search/api/add_meta_engine_source.rb +51 -0
  49. data/lib/elastic/app-search/api/api_logs.rb +62 -0
  50. data/lib/elastic/app-search/api/count_analytics.rb +52 -0
  51. data/lib/elastic/app-search/api/create_curation.rb +54 -0
  52. data/lib/elastic/app-search/api/create_engine.rb +53 -0
  53. data/lib/elastic/app-search/api/create_synonym_set.rb +51 -0
  54. data/lib/elastic/app-search/api/curation.rb +53 -0
  55. data/lib/elastic/app-search/api/delete_curation.rb +53 -0
  56. data/lib/elastic/app-search/api/delete_documents.rb +51 -0
  57. data/lib/elastic/app-search/api/delete_engine.rb +50 -0
  58. data/lib/elastic/app-search/api/delete_meta_engine_source.rb +51 -0
  59. data/lib/elastic/app-search/api/delete_synonym_set.rb +53 -0
  60. data/lib/elastic/app-search/api/documents.rb +51 -0
  61. data/lib/elastic/app-search/api/engine.rb +50 -0
  62. data/lib/elastic/app-search/api/index_documents.rb +51 -0
  63. data/lib/elastic/app-search/api/list_curations.rb +52 -0
  64. data/lib/elastic/app-search/api/list_documents.rb +52 -0
  65. data/lib/elastic/app-search/api/list_engines.rb +49 -0
  66. data/lib/elastic/app-search/api/list_synonym_sets.rb +52 -0
  67. data/lib/elastic/app-search/api/log_clickthrough.rb +57 -0
  68. data/lib/elastic/app-search/api/multi_search.rb +51 -0
  69. data/lib/elastic/app-search/api/put_curation.rb +57 -0
  70. data/lib/elastic/app-search/api/put_documents.rb +51 -0
  71. data/lib/elastic/app-search/api/put_schema.rb +51 -0
  72. data/lib/elastic/app-search/api/put_search_settings.rb +51 -0
  73. data/lib/elastic/app-search/api/put_synonym_set.rb +54 -0
  74. data/lib/elastic/app-search/api/query_suggestion.rb +54 -0
  75. data/lib/elastic/app-search/api/reset_search_settings.rb +50 -0
  76. data/lib/elastic/app-search/api/schema.rb +50 -0
  77. data/lib/elastic/app-search/api/search.rb +50 -0
  78. data/lib/elastic/app-search/api/search_settings.rb +50 -0
  79. data/lib/elastic/app-search/api/synonym_set.rb +53 -0
  80. data/lib/elastic/app-search/api/top_clicks_analytics.rb +54 -0
  81. data/lib/elastic/app-search/api/top_queries_analytics.rb +53 -0
  82. data/lib/elastic/app-search/app_search.rb +82 -0
  83. data/lib/elastic/enterprise-search/api/health.rb +43 -0
  84. data/lib/elastic/enterprise-search/api/put_read_only.rb +46 -0
  85. data/lib/elastic/enterprise-search/api/read_only.rb +43 -0
  86. data/lib/elastic/enterprise-search/api/stats.rb +45 -0
  87. data/lib/elastic/enterprise-search/api/version.rb +43 -0
  88. data/lib/elastic/enterprise-search/client.rb +81 -15
  89. data/lib/elastic/enterprise-search/configuration.rb +32 -16
  90. data/lib/elastic/enterprise-search/exceptions.rb +19 -0
  91. data/lib/elastic/enterprise-search/request.rb +62 -80
  92. data/lib/elastic/enterprise-search/utils.rb +28 -1
  93. data/lib/elastic/enterprise-search/version.rb +20 -1
  94. data/lib/elastic/enterprise_search.rb +49 -0
  95. data/lib/elastic/workplace-search/api/add_user_permissions.rb +54 -0
  96. data/lib/elastic/workplace-search/api/content_source.rb +49 -0
  97. data/lib/elastic/workplace-search/api/create_analytics_event.rb +59 -0
  98. data/lib/elastic/workplace-search/api/create_content_source.rb +52 -0
  99. data/lib/elastic/workplace-search/api/create_external_identity.rb +53 -0
  100. data/lib/elastic/workplace-search/api/delete_all_documents.rb +49 -0
  101. data/lib/elastic/workplace-search/api/delete_content_source.rb +49 -0
  102. data/lib/elastic/workplace-search/api/delete_documents.rb +51 -0
  103. data/lib/elastic/workplace-search/api/delete_external_identity.rb +53 -0
  104. data/lib/elastic/workplace-search/api/document.rb +53 -0
  105. data/lib/elastic/workplace-search/api/external_identity.rb +53 -0
  106. data/lib/elastic/workplace-search/api/index_documents.rb +52 -0
  107. data/lib/elastic/workplace-search/api/list_content_sources.rb +48 -0
  108. data/lib/elastic/workplace-search/api/list_external_identities.rb +51 -0
  109. data/lib/elastic/workplace-search/api/list_permissions.rb +51 -0
  110. data/lib/elastic/workplace-search/api/put_content_source.rb +55 -0
  111. data/lib/elastic/workplace-search/api/put_external_identity.rb +56 -0
  112. data/lib/elastic/workplace-search/api/put_user_permissions.rb +54 -0
  113. data/lib/elastic/workplace-search/api/remove_user_permissions.rb +54 -0
  114. data/lib/elastic/workplace-search/api/search.rb +60 -0
  115. data/lib/elastic/workplace-search/api/user_permissions.rb +53 -0
  116. data/lib/elastic/workplace-search/workplace_search.rb +89 -0
  117. data/spec/app-search/api_count_analytics_spec.rb +34 -0
  118. data/spec/app-search/api_curations_spec.rb +97 -0
  119. data/spec/app-search/api_documents_spec.rb +102 -0
  120. data/spec/app-search/api_engines_spec.rb +67 -0
  121. data/spec/app-search/api_log_clickthrough_spec.rb +34 -0
  122. data/spec/app-search/api_logs_spec.rb +36 -0
  123. data/spec/app-search/api_meta_engines_spec.rb +72 -0
  124. data/spec/app-search/api_query_suggestion_spec.rb +39 -0
  125. data/spec/app-search/api_schema_spec.rb +48 -0
  126. data/spec/app-search/api_search_and_multi_search_spec.rb +48 -0
  127. data/spec/app-search/api_search_settings_spec.rb +76 -0
  128. data/spec/app-search/api_spec_helper.rb +14 -0
  129. data/spec/app-search/api_synonyms_spec.rb +79 -0
  130. data/spec/app-search/api_top_clicks_analytics_spec.rb +44 -0
  131. data/spec/app-search/api_top_queries_analytics_spec.rb +34 -0
  132. data/spec/app-search/client_spec.rb +88 -0
  133. data/spec/app-search/date_spec.rb +69 -0
  134. data/spec/enterprise-search/client_spec.rb +107 -0
  135. data/spec/enterprise-search/request_spec.rb +136 -0
  136. data/spec/enterprise-search/utils_spec.rb +46 -0
  137. data/spec/fixtures/vcr/app_search/add_meta_engine_source.yml +109 -0
  138. data/spec/fixtures/vcr/app_search/api_documents.yml +56 -0
  139. data/spec/fixtures/vcr/app_search/api_index_documents.yml +57 -0
  140. data/spec/fixtures/vcr/app_search/api_log_clickthrough.yml +54 -0
  141. data/spec/fixtures/vcr/app_search/api_logs.yml +70 -0
  142. data/spec/fixtures/vcr/app_search/api_put_schema.yml +109 -0
  143. data/spec/fixtures/vcr/app_search/api_put_search_settings.yml +56 -0
  144. data/spec/fixtures/vcr/app_search/api_query_suggestion.yml +59 -0
  145. data/spec/fixtures/vcr/app_search/api_reset_search_settings.yml +56 -0
  146. data/spec/fixtures/vcr/app_search/api_schema.yml +56 -0
  147. data/spec/fixtures/vcr/app_search/api_search_settings.yml +56 -0
  148. data/spec/fixtures/vcr/app_search/api_top_clicks_analytics.yml +55 -0
  149. data/spec/fixtures/vcr/app_search/api_top_clicks_analytics_query.yml +55 -0
  150. data/spec/fixtures/vcr/app_search/api_top_queries_analytics.yml +55 -0
  151. data/spec/fixtures/vcr/app_search/count_analytics.yml +55 -0
  152. data/spec/fixtures/vcr/app_search/create_and_update_document.yml +107 -0
  153. data/spec/fixtures/vcr/app_search/create_curation.yml +113 -0
  154. data/spec/fixtures/vcr/app_search/create_engine.yml +55 -0
  155. data/spec/fixtures/vcr/app_search/create_meta_engine.yml +56 -0
  156. data/spec/fixtures/vcr/app_search/create_synonym_set.yml +56 -0
  157. data/spec/fixtures/vcr/app_search/delete_curation.yml +56 -0
  158. data/spec/fixtures/vcr/app_search/delete_engine.yml +55 -0
  159. data/spec/fixtures/vcr/app_search/delete_meta_engine_source.yml +56 -0
  160. data/spec/fixtures/vcr/app_search/delete_synonym_set.yml +56 -0
  161. data/spec/fixtures/vcr/app_search/get_curation.yml +56 -0
  162. data/spec/fixtures/vcr/app_search/get_engine.yml +55 -0
  163. data/spec/fixtures/vcr/app_search/index_and_delete_document.yml +107 -0
  164. data/spec/fixtures/vcr/app_search/list_curations.yml +56 -0
  165. data/spec/fixtures/vcr/app_search/list_documents.yml +57 -0
  166. data/spec/fixtures/vcr/app_search/list_engines.yml +55 -0
  167. data/spec/fixtures/vcr/app_search/list_synonym_sets.yml +56 -0
  168. data/spec/fixtures/vcr/app_search/multi_query_search.yml +63 -0
  169. data/spec/fixtures/vcr/app_search/put_curation.yml +113 -0
  170. data/spec/fixtures/vcr/app_search/put_synonym_set.yml +56 -0
  171. data/spec/fixtures/vcr/app_search/search.yml +57 -0
  172. data/spec/fixtures/vcr/app_search/single_query_search.yml +60 -0
  173. data/spec/fixtures/vcr/app_search/synonym_set.yml +56 -0
  174. data/spec/fixtures/vcr/workplace_search/create_analytics_event.yml +55 -0
  175. data/spec/fixtures/vcr/workplace_search/oauth_request_token.yml +57 -0
  176. data/spec/fixtures/vcr/workplace_search/search_request.yml +60 -0
  177. data/spec/integration/enterprise_search_api_spec.rb +100 -0
  178. data/spec/integration/workplace_search_spec.rb +253 -0
  179. data/spec/spec_helper.rb +27 -14
  180. data/spec/webmock_requires.rb +4 -0
  181. data/spec/workplace-search/client_spec.rb +77 -0
  182. data/spec/workplace-search/create_analytics_event_spec.rb +59 -0
  183. data/spec/workplace-search/search_spec.rb +53 -0
  184. metadata +266 -45
  185. data/.circleci/config.yml +0 -68
  186. data/.travis.yml +0 -15
  187. data/NOTICE.txt +0 -3
  188. data/lib/elastic/enterprise-search.rb +0 -7
  189. data/lib/elastic/enterprise-search/client/content_source_documents.rb +0 -46
  190. data/lib/elastic/enterprise-search/client/permissions.rb +0 -30
  191. data/logo-enterprise-search.png +0 -0
  192. data/spec/client/content_source_documents_spec.rb +0 -55
  193. data/spec/client/permissions_spec.rb +0 -75
  194. data/spec/configuration_spec.rb +0 -19
  195. data/spec/fixtures/vcr/add_user_permissions.yml +0 -55
  196. data/spec/fixtures/vcr/async_create_or_update_document_success.yml +0 -51
  197. data/spec/fixtures/vcr/destroy_documents_success.yml +0 -51
  198. data/spec/fixtures/vcr/get_user_permissions.yml +0 -55
  199. data/spec/fixtures/vcr/list_all_permissions.yml +0 -55
  200. data/spec/fixtures/vcr/list_all_permissions_with_paging.yml +0 -55
  201. data/spec/fixtures/vcr/remove_user_permissions.yml +0 -55
  202. data/spec/fixtures/vcr/update_user_permissions.yml +0 -55
data/Rakefile CHANGED
@@ -1 +1,48 @@
1
- require "bundler/gem_tasks"
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ # frozen_string_literal: true
19
+
20
+ require 'rspec/core/rake_task'
21
+ require 'bundler/gem_tasks'
22
+
23
+ desc 'Open an irb session preloaded with this library'
24
+ task :console do
25
+ sh 'irb -r rubygems -I lib -r elastic-enterprise-search.rb'
26
+ end
27
+
28
+ desc 'Run Elastic Enterprise Search stack'
29
+ task :stack, [:version] do |_, params|
30
+ sh "STACK_VERSION=#{params[:version]} ./.ci/run-local.sh"
31
+ end
32
+
33
+ namespace :spec do
34
+ desc 'Run client tests'
35
+ task :client do
36
+ sh 'rspec spec/enterprise-search spec/workplace-search spec/app-search'
37
+ end
38
+
39
+ desc 'Run integration tests'
40
+ task :integration do
41
+ sh 'rspec spec/integration'
42
+ end
43
+
44
+ desc 'Run all tests'
45
+ task :all do
46
+ sh 'rspec spec'
47
+ end
48
+ end
@@ -0,0 +1,186 @@
1
+ [[app-search-api]]
2
+ == App Search API
3
+
4
+ === Engines
5
+
6
+ [source,rb]
7
+ ----------------------------
8
+ # Create an engine
9
+ client.create_engine(name: 'videogames')
10
+
11
+ # List all engines
12
+ client.list_engines
13
+
14
+ # Get an engine
15
+ client.engine('videogames')
16
+
17
+ # Delete an engine
18
+ client.delete_engine('videogames')
19
+ ----------------------------
20
+
21
+ === Meta engines
22
+
23
+ [source,rb]
24
+ ----------------------------
25
+ # Create a meta engine:
26
+ body = {
27
+ name: engine_name,
28
+ type: 'meta',
29
+ source_engines: [ 'books', 'videogames' ]
30
+ }
31
+ client.create_engine(name: engine_name, body: body)
32
+
33
+ # Add a source engine to a meta engine:
34
+ client.add_meta_engine_source(meta_engine_name, source_engines: ['engine1', 'engine2'])
35
+
36
+ # Remove a source enginge from a meta engine:
37
+ client.delete_meta_engine_source(meta_engine_name, source_engines: ['engine1', 'engine2'])
38
+ ----------------------------
39
+
40
+ === Documents
41
+
42
+ [source,rb]
43
+ ----------------------------
44
+ engine_name = 'videogames'
45
+ document = {
46
+ id: 'Mr1064',
47
+ name: 'Super Luigi 64',
48
+ body: 'A classic 3D videogame'
49
+ }
50
+
51
+ # Index documents
52
+ client.index_documents(engine_name, documents: document)
53
+
54
+ # List documents
55
+ client.list_documents(engine_name)
56
+
57
+ # Get document(s) by ID:
58
+ client.documents(engine_name, document_ids: [id1, id2])
59
+
60
+ # Delete a document
61
+ client.delete_documents(engine_name, document_ids: [document_id])
62
+
63
+ # Update a document
64
+ client.put_documents(engine_name, documents: [{id: document_id, key: value}])
65
+ ----------------------------
66
+
67
+ === Search
68
+
69
+ [source,rb]
70
+ ----------------------------
71
+ # Single Search
72
+ query = {
73
+ query: 'luigi'
74
+ }
75
+
76
+ client.search(engine_name, query)
77
+
78
+ # Search with multiple filters
79
+ client.search('parks', {
80
+ body: {
81
+ query: "olympic",
82
+ filters: {
83
+ all: [
84
+ { states: "Washington" },
85
+ { world_heritage_site: "true" }
86
+ ]
87
+ }
88
+ }
89
+ })
90
+
91
+ # Multi query search
92
+ queries = [{ query: 'Nicanor'}, { query: 'Iain' }]
93
+
94
+ client.multi_search(engine_name, body: queries)
95
+
96
+ ----------------------------
97
+
98
+ === Synonym Sets
99
+
100
+ [source,rb]
101
+ ----------------------------
102
+ # Create a synonym set
103
+ client.create_synonym_set(engine_name, body: {['synonym1', 'synonym2']})
104
+
105
+ # List synonym sets
106
+ client.list_synonym_sets(engine_name)
107
+
108
+ # Retrieve a synonym set by id
109
+ client.synonym_set(engine_name, synonym_set_id: 'id')
110
+
111
+ # Update a synonym set by id
112
+ client.put_synonym_set(engine_name, synonym_set_id: 'id', body: {synonyms: ['synonym2', 'synonym3']})
113
+
114
+ # Delete a synonym set
115
+ client.delete_synonym_set(engine_name, synonym_set_id: id)
116
+ ----------------------------
117
+
118
+ === Curations
119
+
120
+ [source,rb]
121
+ ----------------------------
122
+ # Create a curation
123
+ client.create_curation(
124
+ engine_name,
125
+ queries: ['query1'],
126
+ promoted: ['doc-id1'],
127
+ hidden: ['doc-id2']
128
+ )
129
+
130
+ # Retrieve a curation by id:
131
+ client.curation(engine_name, curation_id: 'cur-id')
132
+
133
+ # Update an existing curation:
134
+ client.put_curation(
135
+ engine_name,
136
+ curation_id: 'cur-id',
137
+ queries: ['query1'],
138
+ promoted: ['doc-id2'],
139
+ hidden: ['doc-id1']
140
+ )
141
+
142
+ # List existing curations:
143
+ client.list_curations(engine_name)
144
+
145
+ # Delete a curation:
146
+ client.delete_curation(engine_name, curation_id: 'cur-id')
147
+ ----------------------------
148
+
149
+ === Other API Endpoints
150
+
151
+ [source,rb]
152
+ ----------------------------
153
+ # Count analytics - Returns the number of clicks and total number of queries over a period
154
+ client.count_analytics(engine_name)
155
+
156
+ # Schema - Retrieve current schema for the engine
157
+ client.schema(engine_name)
158
+
159
+ # Update schema for an engine
160
+ client.put_schema(engine_name, schema: {field: 'type'})
161
+
162
+ # Logs - The API Log displays API request and response data at the Engine level
163
+ client.api_logs(engine_name, from_date: Date.new(2020, 10, 01), to_date: Date.new(2020, 11, 05))
164
+
165
+ # Queries Analytics - Returns queries analytics by usage count
166
+ client.top_queries_analytics(engine_name)
167
+
168
+ # Clicks Analytics - Returns the number of clicks received by a document in descending order
169
+ client.top_clicks_analytics(engine_name, query: {})
170
+
171
+ # Search Settings - Returns current search settings for an engine
172
+ client.search_settings(engine_name)
173
+
174
+ # Update Search Settings
175
+ client.put_search_settings(engine_name, body: body)
176
+
177
+ # Reset search settings
178
+ # Warning: This means your settings are wiped! Back them up!
179
+ client.reset_search_settings(engine_name)
180
+
181
+ # Click - Send data about clicked results
182
+ client.log_clickthrough(engine_name, query_text: 'query', document_id: 'doc-id')
183
+
184
+ # Query Suggestion - Provide relevant query suggestions for incomplete queries
185
+ client.query_suggestion(engine_name, query: 'incomplete_query')
186
+ ----------------------------
@@ -0,0 +1,171 @@
1
+ [[connecting]]
2
+ == Connecting
3
+
4
+
5
+ This page contains the information you need to connect and use the Client with Elastic Enterprise Search.
6
+
7
+ **On this page**
8
+
9
+ * <<authentication>>
10
+ * <<custom_headers>>
11
+
12
+
13
+ [discrete]
14
+ [[authentication]]
15
+ === Authentication
16
+
17
+
18
+ This section contains code snippets to show you how to connect to Enterprise Search, App Search, and Workplace Search.
19
+
20
+ Each service has its own authentication schemes. Using the `http_auth` property with either a string for a key / token or a tuple of `(username, password)` for basic authentication will set the proper `Authorization` HTTP header on the client instance.
21
+
22
+ [discrete]
23
+ [[auth-ent]]
24
+ ==== Authenticating with Enterprise Search
25
+
26
+ Enterprise Search supports HTTP basic authentication with a username and password.
27
+
28
+ HTTP basic authentication uses the `http_auth` parameter by passing in a username and password as a tuple:
29
+
30
+ [source,rb]
31
+ ----------------------------
32
+ http_auth = {user: 'elastic', password: 'password'}
33
+ host = 'https://id.ent-search.europe-west2.gcp.elastic-cloud.com'
34
+
35
+ ent_client = Elastic::EnterpriseSearch::Client.new(host: host, http_auth: http_auth)
36
+ ----------------------------
37
+
38
+
39
+ [discrete]
40
+ [[auth-as]]
41
+ ==== Authenticating with App Search
42
+
43
+ In your Elastic App Search dashboard, navigate to Credentials and Create a Key for the client to use. Make sure to read https://www.elastic.co/guide/en/app-search/current/authentication.html[the documentation on Authentication] to understand which key you want to use. Once you've created your key, you need to copy the key value to use on your client.
44
+
45
+ The App Search client can be accessed from an existing Enterprise Search Client, or you can initialize a new one. If you instantiate the App Search client from an existing Enterprise Search Client, it's going to share the HTTP transport instance, so it's going to connect to the same host which is a common scenario. However, if you want to connect to a different host, you should instantiate a new App Search Client on its own.
46
+
47
+ [source,rb]
48
+ ----------------------------
49
+ host = 'https://id.ent-search.europe-west2.gcp.elastic-cloud.com'
50
+ api_key = 'private-api-key'
51
+
52
+ # From the Enterprise Search client:
53
+ ent_client = Elastic::EnterpriseSearch::Client.new(host: host)
54
+ ent_client.app_search.http_auth = api_key
55
+
56
+ # On its own
57
+ client = Elastic::EnterpriseSearch::AppSearch::Client.new(host: host, http_auth: api_key)
58
+ ----------------------------
59
+
60
+ [discrete]
61
+ [[signed-search-key]]
62
+ ===== Signed search key
63
+
64
+ App Search also supports https://www.elastic.co/guide/en/app-search/current/authentication.html#authentication-signed[authenticating with signed search keys]. Here's an example on how to use it:
65
+
66
+ [source,rb]
67
+ ----------------------------
68
+ public_search_key = 'search-key-value'
69
+ # This name must match the name of the key above from your App Search dashboard
70
+ public_search_key_name = 'search-key'
71
+
72
+ # Say we have documents with a title and an author. We want this key to be able
73
+ # to search by title, but only return the author:
74
+ options = {
75
+ search_fields: { title: {} },
76
+ result_fields: { author: { raw: {} } }
77
+ }
78
+
79
+ signed_search_key = Elastic::EnterpriseSearch::AppSearch::Client.create_signed_search_key(public_search_key, public_search_key_name, options)
80
+
81
+ client = Elastic::EnterpriseSearch::AppSearch::Client.new(http_auth: signed_search_key)
82
+
83
+ client.search(engine_name, query: 'jungle')
84
+ ----------------------------
85
+
86
+ [discrete]
87
+ [[auth-ws]]
88
+ ==== Authenticating with Workplace Search
89
+
90
+ Workplace Search supports multiple authentication methods:
91
+
92
+ [discrete]
93
+ [[access-tokens]]
94
+ ===== Workplace Search admin user access tokens
95
+
96
+ In your Elastic Workplace Search dashboard navigate to _Sources/Add a Shared Content Source_ and select _Custom API Source_ to create a new source. Name your source (e.g. `Enterprise Search Ruby Client`) and once it's created you'll get an `access token` and an `ID`.
97
+
98
+ The Workplace Search client can be accessed from an existing Enterprise Search Client, or you can initialize a new one. If you instantiate the Workplace Search client from an existing Enterprise Search Client, it's going to share the HTTP transport instance, so it's going to connect to the same host, which is a common scenario. However, if you want to connect to a different host, you should instantiate a new Workplace Client on its own:
99
+
100
+ [source,rb]
101
+ ----------------------------
102
+ host = 'https://id.ent-search.europe-west2.gcp.elastic-cloud.com'
103
+ access_token = '<access token>'
104
+ content_source_id = '<content source id>'
105
+
106
+ # From the Enterprise Search client:
107
+ ent_client = Elastic::EnterpriseSearch::Client.new(host: host)
108
+ ent_client.workplace_search.http_auth = access_token
109
+ ent_client.workplace_search.index_documents(content_source_id, body: documents)
110
+
111
+ # On its own
112
+ workplace_search_client = Elastic::EnterpriseSearch::WorkplaceSearch::Client.new(
113
+ host: host,
114
+ http_auth: access_token
115
+ )
116
+ ----------------------------
117
+
118
+ [discrete]
119
+ [[basic-auth]]
120
+ ===== Basic Authentication
121
+
122
+ Workplace Search APIs support basic authentication headers to authenticate users. All Workplace Search APIs support basic authentication:
123
+
124
+ [source,rb]
125
+ ----------------------------
126
+ host = 'https://id.ent-search.europe-west2.gcp.elastic-cloud.com'
127
+ basic_auth = { user: 'enterprise_search', password: 'changeme' }
128
+
129
+ workplace_search_client = Elastic::EnterpriseSearch::WorkplaceSearch::Client.new(
130
+ host: host,
131
+ http_auth: basic_auth
132
+ )
133
+ ----------------------------
134
+
135
+ [discrete]
136
+ [[es-tokens]]
137
+ ===== Elasticsearch tokens
138
+
139
+ Workplace Search APIs support Elasticsearch tokens generated by the Elasticsearch Token Service. All Workplace Search APIs support Elasticsearch tokens as an authentication method.
140
+
141
+ [source,rb]
142
+ ----------------------------
143
+ host = 'https://id.ent-search.europe-west2.gcp.elastic-cloud.com'
144
+ access_token = '<access token>'
145
+
146
+ workplace_search_client = Elastic::EnterpriseSearch::WorkplaceSearch::Client.new(
147
+ host: host,
148
+ http_auth: access_token
149
+ )
150
+ ----------------------------
151
+
152
+ [discrete]
153
+ [[ws-oauth]]
154
+ ===== Workplace Search OAuth access tokens
155
+
156
+ The Search API and the Analytics Events API support user access tokens generated by the Workplace Search OAuth Service. The token is acquired via an OAuth authorization flow. User access tokens are meant to be used for Custom Search Experiences. Check <<ws-oauth-authentication>>.
157
+
158
+ [discrete]
159
+ [[custom_headers]]
160
+ === Custom HTTP Headers
161
+
162
+ You can pass in headers as a parameter to any of the API Endpoints to set custom headers for the request:
163
+
164
+ [source,rb]
165
+ ----------------------------
166
+ headers = { 'x-custom-header' => 'Header value' }
167
+ workplace_search_client.index_documents(
168
+ content_source_id,
169
+ { body: documents, headers: headers }
170
+ )
171
+ ----------------------------
@@ -0,0 +1,42 @@
1
+ [[development]]
2
+ == Development
3
+
4
+ [discrete]
5
+ === Run Stack locally
6
+
7
+ A rake task is included to run the Elastic Enterprise Search stack locally via Docker:
8
+
9
+ [source,bash]
10
+ ----------------------------
11
+ $ rake stack[7.10.0]
12
+ ----------------------------
13
+
14
+ This will run Elastic Enterprise Search in http://localhost:3002
15
+ - Username: `enterprise_search`
16
+ - Password: `changeme`
17
+
18
+ [discrete]
19
+ === Run Tests
20
+
21
+ Unit tests for the clients:
22
+
23
+ [source,bash]
24
+ ----------------------------
25
+ $ rake spec:client
26
+ ----------------------------
27
+
28
+ Integration tests: you need to have an instance of Enterprise Search running either locally or remotely, and specify the host and credentials in environment variables (see below for a complete dockerized setup). If you're using the included rake task `rake stack[:version]`, you can run the integration tests with the following command:
29
+
30
+ [source,bash]
31
+ ----------------------------
32
+ $ ELASTIC_ENTERPRISE_HOST='http://localhost:3002' \
33
+ ELASTIC_ENTERPRISE_USER='elastic' \
34
+ ELASTIC_ENTERPRISE_PASSWORD='changeme' \
35
+ rake spec:integration
36
+ ----------------------------
37
+
38
+ Run integration tests completely within containers, the way we run them on our CI:
39
+ [source,bash]
40
+ ----------------------------
41
+ RUNSCRIPTS=enterprise-search STACK_VERSION=7.10.0 ./.ci/run-tests
42
+ ----------------------------