elastic-enterprise-search 0.2.1 → 7.12.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/.ci/.gitignore +1 -0
- data/.ci/Dockerfile +12 -0
- data/.ci/certs/README.md +50 -0
- data/.ci/certs/ca.crt +20 -0
- data/.ci/certs/ca.key +27 -0
- data/.ci/certs/testnode.crt +21 -0
- data/.ci/certs/testnode.key +27 -0
- data/.ci/certs/testnode_no_san.crt +19 -0
- data/.ci/certs/testnode_no_san.key +27 -0
- data/.ci/functions/cleanup.sh +67 -0
- data/.ci/functions/imports.sh +59 -0
- data/.ci/functions/wait-for-container.sh +36 -0
- data/.ci/jobs/defaults.yml +69 -0
- data/.ci/jobs/elastic+enterprise-search-ruby+7.11.yml +12 -0
- data/.ci/jobs/elastic+enterprise-search-ruby+master.yml +12 -0
- data/.ci/jobs/elastic+enterprise-search-ruby+pull-request.yml +19 -0
- data/.ci/run-elasticsearch.sh +127 -0
- data/.ci/run-enterprise-search.sh +71 -0
- data/.ci/run-local.sh +14 -0
- data/.ci/run-repository.sh +47 -0
- data/.ci/run-tests +27 -0
- data/.ci/test-matrix.yml +14 -0
- data/.github/workflows/rubocop.yml +15 -0
- data/.github/workflows/testing.yml +40 -0
- data/.gitignore +4 -0
- data/.rubocop.yml +52 -0
- data/CONTRIBUTING.md +43 -0
- data/Gemfile +23 -1
- data/{LICENSE.txt → LICENSE} +33 -32
- data/README.md +29 -93
- data/Rakefile +48 -1
- data/docs/guide/app-search-api.asciidoc +186 -0
- data/docs/guide/connecting.asciidoc +125 -0
- data/docs/guide/development.asciidoc +42 -0
- data/docs/guide/enterprise-search-api.asciidoc +46 -0
- data/docs/guide/index.asciidoc +19 -0
- data/docs/guide/installation.asciidoc +18 -0
- data/docs/guide/overview.asciidoc +59 -0
- data/docs/guide/release_notes/710.asciidoc +4 -0
- data/docs/guide/release_notes/711.asciidoc +27 -0
- data/docs/guide/release_notes/712.asciidoc +26 -0
- data/docs/guide/release_notes/index.asciidoc +14 -0
- data/docs/guide/workplace-search-api.asciidoc +121 -0
- data/elastic-enterprise-search.gemspec +49 -12
- data/lib/elastic-enterprise-search.rb +20 -1
- data/lib/elastic/.rubocop.yml +6 -0
- data/lib/elastic/app-search/api/add_meta_engine_source.rb +51 -0
- data/lib/elastic/app-search/api/api_logs.rb +62 -0
- data/lib/elastic/app-search/api/count_analytics.rb +52 -0
- data/lib/elastic/app-search/api/create_curation.rb +54 -0
- data/lib/elastic/app-search/api/create_engine.rb +53 -0
- data/lib/elastic/app-search/api/create_synonym_set.rb +51 -0
- data/lib/elastic/app-search/api/curation.rb +53 -0
- data/lib/elastic/app-search/api/delete_curation.rb +53 -0
- data/lib/elastic/app-search/api/delete_documents.rb +51 -0
- data/lib/elastic/app-search/api/delete_engine.rb +50 -0
- data/lib/elastic/app-search/api/delete_meta_engine_source.rb +51 -0
- data/lib/elastic/app-search/api/delete_synonym_set.rb +53 -0
- data/lib/elastic/app-search/api/documents.rb +51 -0
- data/lib/elastic/app-search/api/engine.rb +50 -0
- data/lib/elastic/app-search/api/index_documents.rb +51 -0
- data/lib/elastic/app-search/api/list_curations.rb +52 -0
- data/lib/elastic/app-search/api/list_documents.rb +52 -0
- data/lib/elastic/app-search/api/list_engines.rb +49 -0
- data/lib/elastic/app-search/api/list_synonym_sets.rb +52 -0
- data/lib/elastic/app-search/api/log_clickthrough.rb +57 -0
- data/lib/elastic/app-search/api/multi_search.rb +51 -0
- data/lib/elastic/app-search/api/put_curation.rb +57 -0
- data/lib/elastic/app-search/api/put_documents.rb +51 -0
- data/lib/elastic/app-search/api/put_schema.rb +51 -0
- data/lib/elastic/app-search/api/put_search_settings.rb +51 -0
- data/lib/elastic/app-search/api/put_synonym_set.rb +54 -0
- data/lib/elastic/app-search/api/query_suggestion.rb +54 -0
- data/lib/elastic/app-search/api/reset_search_settings.rb +50 -0
- data/lib/elastic/app-search/api/schema.rb +50 -0
- data/lib/elastic/app-search/api/search.rb +50 -0
- data/lib/elastic/app-search/api/search_settings.rb +50 -0
- data/lib/elastic/app-search/api/synonym_set.rb +53 -0
- data/lib/elastic/app-search/api/top_clicks_analytics.rb +54 -0
- data/lib/elastic/app-search/api/top_queries_analytics.rb +53 -0
- data/lib/elastic/app-search/app_search.rb +82 -0
- data/lib/elastic/enterprise-search/api/health.rb +43 -0
- data/lib/elastic/enterprise-search/api/put_read_only.rb +44 -0
- data/lib/elastic/enterprise-search/api/read_only.rb +43 -0
- data/lib/elastic/enterprise-search/api/stats.rb +45 -0
- data/lib/elastic/enterprise-search/api/version.rb +43 -0
- data/lib/elastic/enterprise-search/client.rb +90 -52
- data/lib/elastic/enterprise-search/configuration.rb +32 -16
- data/lib/elastic/enterprise-search/exceptions.rb +19 -0
- data/lib/elastic/enterprise-search/request.rb +59 -81
- data/lib/elastic/enterprise-search/utils.rb +28 -1
- data/lib/elastic/enterprise-search/version.rb +20 -1
- data/lib/elastic/enterprise_search.rb +38 -0
- data/lib/elastic/workplace-search/api/add_user_permissions.rb +54 -0
- data/lib/elastic/workplace-search/api/create_analytics_event.rb +59 -0
- data/lib/elastic/workplace-search/api/create_external_identity.rb +51 -0
- data/lib/elastic/workplace-search/api/delete_documents.rb +51 -0
- data/lib/elastic/workplace-search/api/delete_external_identity.rb +53 -0
- data/lib/elastic/workplace-search/api/external_identity.rb +53 -0
- data/lib/elastic/workplace-search/api/index_documents.rb +52 -0
- data/lib/elastic/workplace-search/api/list_external_identities.rb +51 -0
- data/lib/elastic/workplace-search/api/list_permissions.rb +51 -0
- data/lib/elastic/workplace-search/api/put_external_identity.rb +54 -0
- data/lib/elastic/workplace-search/api/put_user_permissions.rb +54 -0
- data/lib/elastic/workplace-search/api/remove_user_permissions.rb +54 -0
- data/lib/elastic/workplace-search/api/search.rb +60 -0
- data/lib/elastic/workplace-search/api/user_permissions.rb +53 -0
- data/lib/elastic/workplace-search/workplace_search.rb +84 -0
- data/spec/app-search/api_count_analytics_spec.rb +34 -0
- data/spec/app-search/api_curations_spec.rb +97 -0
- data/spec/app-search/api_documents_spec.rb +102 -0
- data/spec/app-search/api_engines_spec.rb +67 -0
- data/spec/app-search/api_log_clickthrough_spec.rb +34 -0
- data/spec/app-search/api_logs_spec.rb +36 -0
- data/spec/app-search/api_meta_engines_spec.rb +72 -0
- data/spec/app-search/api_query_suggestion_spec.rb +39 -0
- data/spec/app-search/api_schema_spec.rb +48 -0
- data/spec/app-search/api_search_and_multi_search_spec.rb +48 -0
- data/spec/app-search/api_search_settings_spec.rb +76 -0
- data/spec/app-search/api_spec_helper.rb +14 -0
- data/spec/app-search/api_synonyms_spec.rb +79 -0
- data/spec/app-search/api_top_clicks_analytics_spec.rb +44 -0
- data/spec/app-search/api_top_queries_analytics_spec.rb +34 -0
- data/spec/app-search/client_spec.rb +88 -0
- data/spec/app-search/date_spec.rb +69 -0
- data/spec/enterprise-search/client_spec.rb +107 -0
- data/spec/enterprise-search/request_spec.rb +136 -0
- data/spec/enterprise-search/utils_spec.rb +46 -0
- data/spec/fixtures/vcr/app_search/add_meta_engine_source.yml +109 -0
- data/spec/fixtures/vcr/app_search/api_documents.yml +56 -0
- data/spec/fixtures/vcr/app_search/api_index_documents.yml +57 -0
- data/spec/fixtures/vcr/app_search/api_log_clickthrough.yml +54 -0
- data/spec/fixtures/vcr/app_search/api_logs.yml +70 -0
- data/spec/fixtures/vcr/app_search/api_put_schema.yml +109 -0
- data/spec/fixtures/vcr/app_search/api_put_search_settings.yml +56 -0
- data/spec/fixtures/vcr/app_search/api_query_suggestion.yml +59 -0
- data/spec/fixtures/vcr/app_search/api_reset_search_settings.yml +56 -0
- data/spec/fixtures/vcr/app_search/api_schema.yml +56 -0
- data/spec/fixtures/vcr/app_search/api_search_settings.yml +56 -0
- data/spec/fixtures/vcr/app_search/api_top_clicks_analytics.yml +55 -0
- data/spec/fixtures/vcr/app_search/api_top_clicks_analytics_query.yml +55 -0
- data/spec/fixtures/vcr/app_search/api_top_queries_analytics.yml +55 -0
- data/spec/fixtures/vcr/app_search/count_analytics.yml +55 -0
- data/spec/fixtures/vcr/app_search/create_and_update_document.yml +107 -0
- data/spec/fixtures/vcr/app_search/create_curation.yml +113 -0
- data/spec/fixtures/vcr/app_search/create_engine.yml +55 -0
- data/spec/fixtures/vcr/app_search/create_meta_engine.yml +56 -0
- data/spec/fixtures/vcr/app_search/create_synonym_set.yml +56 -0
- data/spec/fixtures/vcr/app_search/delete_curation.yml +56 -0
- data/spec/fixtures/vcr/app_search/delete_engine.yml +55 -0
- data/spec/fixtures/vcr/app_search/delete_meta_engine_source.yml +56 -0
- data/spec/fixtures/vcr/app_search/delete_synonym_set.yml +56 -0
- data/spec/fixtures/vcr/app_search/get_curation.yml +56 -0
- data/spec/fixtures/vcr/app_search/get_engine.yml +55 -0
- data/spec/fixtures/vcr/app_search/index_and_delete_document.yml +107 -0
- data/spec/fixtures/vcr/app_search/list_curations.yml +56 -0
- data/spec/fixtures/vcr/app_search/list_documents.yml +57 -0
- data/spec/fixtures/vcr/app_search/list_engines.yml +55 -0
- data/spec/fixtures/vcr/app_search/list_synonym_sets.yml +56 -0
- data/spec/fixtures/vcr/app_search/multi_query_search.yml +63 -0
- data/spec/fixtures/vcr/app_search/put_curation.yml +113 -0
- data/spec/fixtures/vcr/app_search/put_synonym_set.yml +56 -0
- data/spec/fixtures/vcr/app_search/search.yml +57 -0
- data/spec/fixtures/vcr/app_search/single_query_search.yml +60 -0
- data/spec/fixtures/vcr/app_search/synonym_set.yml +56 -0
- data/spec/fixtures/vcr/workplace_search/add_user_permissions.yml +53 -0
- data/spec/fixtures/vcr/workplace_search/clear_user_permissions.yml +53 -0
- data/spec/fixtures/vcr/workplace_search/create_analytics_event.yml +55 -0
- data/spec/fixtures/vcr/workplace_search/create_external_identity.yml +53 -0
- data/spec/fixtures/vcr/workplace_search/delete_documents.yml +53 -0
- data/spec/fixtures/vcr/workplace_search/delete_external_identity.yml +53 -0
- data/spec/fixtures/vcr/workplace_search/index_documents.yml +55 -0
- data/spec/fixtures/vcr/workplace_search/list_external_identities.yml +53 -0
- data/spec/fixtures/vcr/workplace_search/list_permissions.yml +53 -0
- data/spec/fixtures/vcr/workplace_search/oauth_request_token.yml +57 -0
- data/spec/fixtures/vcr/workplace_search/put_external_identity.yml +53 -0
- data/spec/fixtures/vcr/workplace_search/put_user_permissions.yml +103 -0
- data/spec/fixtures/vcr/workplace_search/remove_user_permissions.yml +53 -0
- data/spec/fixtures/vcr/workplace_search/retrieve_external_identity.yml +53 -0
- data/spec/fixtures/vcr/workplace_search/search_request.yml +60 -0
- data/spec/fixtures/vcr/workplace_search/user_permissions_empty.yml +53 -0
- data/spec/integration/enterprise_search_api_spec.rb +96 -0
- data/spec/spec_helper.rb +27 -14
- data/spec/webmock_requires.rb +4 -0
- data/spec/workplace-search/client_spec.rb +77 -0
- data/spec/workplace-search/create_analytics_event_spec.rb +59 -0
- data/spec/workplace-search/documents_spec.rb +80 -0
- data/spec/workplace-search/external_identities_spec.rb +84 -0
- data/spec/workplace-search/permissions_spec.rb +136 -0
- data/spec/workplace-search/search_spec.rb +53 -0
- metadata +272 -28
- data/.circleci/config.yml +0 -68
- data/.travis.yml +0 -15
- data/NOTICE.txt +0 -3
- data/lib/elastic/enterprise-search.rb +0 -7
- data/logo-enterprise-search.png +0 -0
- data/spec/client_spec.rb +0 -57
- data/spec/configuration_spec.rb +0 -19
- data/spec/fixtures/vcr/async_create_or_update_document_success.yml +0 -51
- data/spec/fixtures/vcr/destroy_documents_success.yml +0 -51
@@ -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,125 @@
|
|
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
|
+
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`. You'll need these in the following steps.
|
91
|
+
|
92
|
+
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:
|
93
|
+
|
94
|
+
[source,rb]
|
95
|
+
----------------------------
|
96
|
+
host = 'https://id.ent-search.europe-west2.gcp.elastic-cloud.com'
|
97
|
+
access_token = '<access token>'
|
98
|
+
content_source_id = '<content source id>'
|
99
|
+
|
100
|
+
# From the Enterprise Search client:
|
101
|
+
ent_client = Elastic::EnterpriseSearch::Client.new(host: host)
|
102
|
+
ent_client.workplace_search.http_auth = access_token
|
103
|
+
ent_client.workplace_search.index_documents(content_source_id, body: documents)
|
104
|
+
|
105
|
+
# On its own
|
106
|
+
workplace_search_client = Elastic::EnterpriseSearch::WorkplaceSearch::Client.new(
|
107
|
+
host: host,
|
108
|
+
http_auth: access_token
|
109
|
+
)
|
110
|
+
----------------------------
|
111
|
+
|
112
|
+
[discrete]
|
113
|
+
[[custom_headers]]
|
114
|
+
=== Custom HTTP Headers
|
115
|
+
|
116
|
+
You can pass in headers as a parameter to any of the API Endpoints to set custom headers for the request:
|
117
|
+
|
118
|
+
[source,rb]
|
119
|
+
----------------------------
|
120
|
+
headers = { 'x-custom-header' => 'Header value' }
|
121
|
+
workplace_search_client.index_documents(
|
122
|
+
content_source_id,
|
123
|
+
{ body: documents, headers: headers }
|
124
|
+
)
|
125
|
+
----------------------------
|
@@ -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
|
+
----------------------------
|
@@ -0,0 +1,46 @@
|
|
1
|
+
[[enterprise-search-api]]
|
2
|
+
== Enterprise Search API
|
3
|
+
|
4
|
+
=== Health API
|
5
|
+
|
6
|
+
[source,rb]
|
7
|
+
----------------------------
|
8
|
+
> response = ent_client.health
|
9
|
+
> response.body
|
10
|
+
=> {"name"=>"...",
|
11
|
+
"version"=>{"number"=>"7.10.0", "build_hash"=>"...", "build_date"=>"..."},
|
12
|
+
"jvm"=>{...},
|
13
|
+
"filebeat"=>{...},
|
14
|
+
"system"=>{...}
|
15
|
+
}
|
16
|
+
----------------------------
|
17
|
+
|
18
|
+
=== Version API
|
19
|
+
|
20
|
+
[source,rb]
|
21
|
+
----------------------------
|
22
|
+
> response = ent_client.version
|
23
|
+
> response.body
|
24
|
+
=> {"number"=>"7.10.0", "build_hash"=>"...", "build_date"=>"..."}
|
25
|
+
----------------------------
|
26
|
+
|
27
|
+
=== Managing Read-Only mode:
|
28
|
+
|
29
|
+
[source,rb]
|
30
|
+
----------------------------
|
31
|
+
# Set read-only flag state
|
32
|
+
ent_client.put_read_only(body: { enabled: false })
|
33
|
+
|
34
|
+
# Get read-only flag state
|
35
|
+
ent_client.read_only
|
36
|
+
----------------------------
|
37
|
+
|
38
|
+
=== Stats API
|
39
|
+
|
40
|
+
[source,rb]
|
41
|
+
----------------------------
|
42
|
+
> ent_client.stats.body
|
43
|
+
=> {"app"=>{"pid"=>1, "start"=>"...", "end"=>"", "metrics"=>{...}},
|
44
|
+
"queues"=>{"connectors"=>{...}, "document_destroyer"=>{...}, "engine_destroyer"=>{...}, "index_adder"=>{...}, ...},
|
45
|
+
"connectors"=>{"alive"=>true, "pool"=>{...}, "job_store"=>{...}}}}
|
46
|
+
----------------------------
|
@@ -0,0 +1,19 @@
|
|
1
|
+
= enterprise-search-ruby
|
2
|
+
|
3
|
+
:doctype: book
|
4
|
+
|
5
|
+
include::{asciidoc-dir}/../../shared/attributes.asciidoc[]
|
6
|
+
|
7
|
+
include::overview.asciidoc[]
|
8
|
+
|
9
|
+
include::installation.asciidoc[]
|
10
|
+
|
11
|
+
include::connecting.asciidoc[]
|
12
|
+
|
13
|
+
include::enterprise-search-api.asciidoc[]
|
14
|
+
|
15
|
+
include::app-search-api.asciidoc[]
|
16
|
+
|
17
|
+
include::workplace-search-api.asciidoc[]
|
18
|
+
|
19
|
+
include::release_notes/index.asciidoc[]
|
@@ -0,0 +1,18 @@
|
|
1
|
+
[[installation]]
|
2
|
+
== Installation
|
3
|
+
|
4
|
+
You can install Enterprise Search Client from Rubygems:
|
5
|
+
|
6
|
+
[source,sh]
|
7
|
+
---------------------------------------------------
|
8
|
+
$ gem install elastic-enterprise-search --pre
|
9
|
+
---------------------------------------------------
|
10
|
+
|
11
|
+
Or add it to your project's Gemfile:
|
12
|
+
|
13
|
+
[source,sh]
|
14
|
+
---------------------------------------------------
|
15
|
+
gem 'elastic-enterprise-search'
|
16
|
+
---------------------------------------------------
|
17
|
+
|
18
|
+
The version follows the Elastic Stack version so 7.10.0 is compatible with Enterprise Search released in Elastic Stack 7.10.0.
|
@@ -0,0 +1,59 @@
|
|
1
|
+
[[overview]]
|
2
|
+
== Overview
|
3
|
+
|
4
|
+
This is the official Ruby client for Elastic Enterprise Search.
|
5
|
+
|
6
|
+
[discrete]
|
7
|
+
=== Compatibility
|
8
|
+
|
9
|
+
Current development happens in the master branch.
|
10
|
+
|
11
|
+
The library is compatible with all Elastic Enterprise Search versions since `7.x` but you **have to use a matching major version**:
|
12
|
+
|
13
|
+
For **Elastic Enterprise Search 7.0** and later, use the major version 7 (`7.x.y`) of the library.
|
14
|
+
|
15
|
+
[discrete]
|
16
|
+
=== HTTP Library
|
17
|
+
This library uses https://github.com/elastic/elasticsearch-ruby/tree/master/elasticsearch-transport[elasticsearch-transport], the low-level Ruby client for connecting to an Elasticsearch cluster - also used in the official https://github.com/elastic/elasticsearch-ruby[Elasticsearch Ruby Client].
|
18
|
+
|
19
|
+
All requests, if successful, will return an `Elasticsearch::Transport::Transport::Response` instance. You can access the response `body`, `headers` and `status`.
|
20
|
+
|
21
|
+
`elasticsearch-transport` defines a https://github.com/elasticsearch/elasticsearch-ruby/blob/master/elasticsearch-transport/lib/elasticsearch/transport/transport/errors.rb[number of exception classes] for various client and server errors, as well as unsuccessful HTTP responses, making it possible to rescue specific exceptions with desired granularity. More details https://github.com/elastic/elasticsearch-ruby/tree/master/elasticsearch-transport#exception-handling[here]. You can find the full documentation for `elasticsearch-transport` at https://rubydoc.info/gems/elasticsearch-transport[RubyDoc].
|
22
|
+
|
23
|
+
The clients pass different options to transport, you can check them out https://rubydoc.info/github/elastic/enterprise-search-ruby/Elastic/EnterpriseSearch/Client[on RubyDocs].
|
24
|
+
|
25
|
+
[discrete]
|
26
|
+
==== Setting the host and port
|
27
|
+
|
28
|
+
If you don't specify a host and port, the client will default to `http://localhost:3002`. Otherwise pass in the `:host` parameter as a String.
|
29
|
+
|
30
|
+
[discrete]
|
31
|
+
=== Logging
|
32
|
+
|
33
|
+
You can enable logging with the default logger by passing `log: true` as a parameter to the client's initializer, or pass in a Logger object with the `:logger` parameter:
|
34
|
+
|
35
|
+
[source,rb]
|
36
|
+
----------------------------
|
37
|
+
logger = MyLogger.new
|
38
|
+
client = Elastic::EnterpriseSearch::Client.new(logger: logger)
|
39
|
+
----------------------------
|
40
|
+
|
41
|
+
[discrete]
|
42
|
+
=== License
|
43
|
+
|
44
|
+
Licensed to Elasticsearch B.V. under one or more contributor
|
45
|
+
license agreements. See the NOTICE file distributed with
|
46
|
+
this work for additional information regarding copyright
|
47
|
+
ownership. Elasticsearch B.V. licenses this file to you under
|
48
|
+
the Apache License, Version 2.0 (the "License"); you may
|
49
|
+
not use this file except in compliance with the License.
|
50
|
+
You may obtain a copy of the License at
|
51
|
+
|
52
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
53
|
+
|
54
|
+
Unless required by applicable law or agreed to in writing,
|
55
|
+
software distributed under the License is distributed on an
|
56
|
+
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
57
|
+
KIND, either express or implied. See the License for the
|
58
|
+
specific language governing permissions and limitations
|
59
|
+
under the License.
|