algoliasearch 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog +3 -0
- data/README.md +62 -43
- data/lib/algolia/client.rb +51 -32
- data/lib/algolia/index.rb +10 -10
- data/lib/algolia/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d9df8ced9c8a5da4e7e677c2643b24891b84a406
|
4
|
+
data.tar.gz: ea2d150a9d5171f5e4da18a6a5c7758137d31aa5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04a47d4b5227e7e97db5d33fb1759a3c053e0e34a94fb6d7eb380c97a4ae4dbfc097df30755afa2524f41cc93400d19c2b3db5d70676cd9a5469ba68cadab3e4
|
7
|
+
data.tar.gz: 088ba592a94f6e31dd3d0f07f5668b53bb63932fd8680e84c03da0dc7a0add25aaa8a8bfca3f8c9b43ec797d0288391611ec441f89d0bfa77a188de3ffbfdbd8
|
data/ChangeLog
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
|
3
|
+
2015-04-10 1.4.1
|
4
|
+
* Force the default connect/read/write/search/batch timeouts to Algolia-specific values
|
5
|
+
|
3
6
|
2015-03-17 1.4.0
|
4
7
|
* High-available DNS: search queries are now targeting "APPID-DSN.algolia.net" first, then the main cluster using NSOne, then the main cluster using Route53.
|
5
8
|
Indexing queries are targeting "APPID.algolia.net" first, then the main cluster using NSOne, then the main cluster using Route53.
|
data/README.md
CHANGED
@@ -3,21 +3,8 @@
|
|
3
3
|
|
4
4
|
|
5
5
|
[Algolia Search](http://www.algolia.com) is a hosted full-text, numerical, and faceted search engine capable of delivering realtime results from the first keystroke.
|
6
|
-
Algolia's Search API makes it easy to deliver a great search experience in your websites and mobile applications by providing:
|
7
6
|
|
8
|
-
|
9
|
-
* Search against infinite attributes from a single search box
|
10
|
-
* Instant search as you type experience
|
11
|
-
* Relevance and popularity ranking
|
12
|
-
* Global language support
|
13
|
-
* Typo tolerance in any language
|
14
|
-
* Smart highlighting
|
15
|
-
* Facet as you type
|
16
|
-
* Geo awareness
|
17
|
-
* 99.99% SLA
|
18
|
-
* First class data security
|
19
|
-
|
20
|
-
Our Ruby client lets you easily use the [Algolia Search API](http://www.algolia.com) from your backend. It wraps the [Algolia Search REST API](http://www.algolia.com/doc/rest_api).
|
7
|
+
Our Ruby client lets you easily use the [Algolia Search API](https://www.algolia.com/doc/rest_api) from your backend. It wraps the [Algolia Search REST API](http://www.algolia.com/doc/rest_api).
|
21
8
|
|
22
9
|
|
23
10
|
[![Build Status](https://travis-ci.org/algolia/algoliasearch-client-ruby.svg?branch=master)](https://travis-ci.org/algolia/algoliasearch-client-ruby) [![Gem Version](https://badge.fury.io/rb/algoliasearch.svg)](http://badge.fury.io/rb/algoliasearch) [![Code Climate](https://codeclimate.com/github/algolia/algoliasearch-client-ruby.svg)](https://codeclimate.com/github/algolia/algoliasearch-client-ruby) [![Coverage Status](https://coveralls.io/repos/algolia/algoliasearch-client-ruby/badge.png)](https://coveralls.io/r/algolia/algoliasearch-client-ruby)
|
@@ -131,25 +118,35 @@ puts index.search('jim').to_json
|
|
131
118
|
|
132
119
|
**Notes:** If you are building a web application, you may be more interested in using our [JavaScript client](https://github.com/algolia/algoliasearch-client-js) to perform queries. It brings two benefits:
|
133
120
|
* Your users get a better response time by not going through your servers
|
134
|
-
* It will offload unnecessary tasks from your servers
|
121
|
+
* It will offload unnecessary tasks from your servers
|
135
122
|
|
136
123
|
```html
|
137
|
-
<script
|
138
|
-
<script
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
124
|
+
<script src="//cdn.jsdelivr.net/algoliasearch/3/algoliasearch.min.js"></script>
|
125
|
+
<script>
|
126
|
+
var client = algoliasearch('ApplicationID', 'Search-Only-API-Key');
|
127
|
+
var index = client.initIndex('indexName');
|
128
|
+
|
129
|
+
// perform query "jim"
|
130
|
+
index.search('jim', searchCallback);
|
131
|
+
|
132
|
+
// the last optional argument can be used to add search parameters
|
133
|
+
index.search(
|
134
|
+
'jim', {
|
135
|
+
hitsPerPage: 5,
|
136
|
+
facets: '*',
|
137
|
+
maxValuesPerFacet: 10
|
138
|
+
},
|
139
|
+
searchCallback
|
140
|
+
);
|
141
|
+
|
142
|
+
function searchCallback(err, content) {
|
143
|
+
if (err) {
|
144
|
+
console.error(err);
|
145
|
+
return;
|
146
146
|
}
|
147
147
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
// the last optional argument can be used to add search parameters
|
152
|
-
index.search("jim", searchCallback, { hitsPerPage: 5, facets: '*', maxValuesPerFacet: 10 });
|
148
|
+
console.log(content);
|
149
|
+
}
|
153
150
|
</script>
|
154
151
|
```
|
155
152
|
|
@@ -390,7 +387,7 @@ res = index.search("query string", { "attributesToRetrieve" => "firstname,lastna
|
|
390
387
|
|
391
388
|
The server response will look like:
|
392
389
|
|
393
|
-
```
|
390
|
+
```json
|
394
391
|
{
|
395
392
|
"hits": [
|
396
393
|
{
|
@@ -458,6 +455,7 @@ res = index.get_object("myID", "fistname")
|
|
458
455
|
|
459
456
|
You can also retrieve a set of objects:
|
460
457
|
|
458
|
+
|
461
459
|
```ruby
|
462
460
|
res = index.get_objects(["myID", "myID2"])
|
463
461
|
```
|
@@ -466,6 +464,7 @@ res = index.get_objects(["myID", "myID2"])
|
|
466
464
|
|
467
465
|
|
468
466
|
|
467
|
+
|
469
468
|
Delete an object
|
470
469
|
-------------
|
471
470
|
|
@@ -740,15 +739,23 @@ You may have a single index containing per user data. In that case, all records
|
|
740
739
|
public_key = Algolia.generate_secured_api_key 'YourSearchOnlyApiKey', '(public,user_42)'
|
741
740
|
```
|
742
741
|
|
743
|
-
This public API key
|
742
|
+
This public API key can then be used in your JavaScript code as follow:
|
744
743
|
|
745
744
|
```javascript
|
746
745
|
<script type="text/javascript">
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
746
|
+
var client = algoliasearch('YourApplicationID', '<%= public_api_key %>');
|
747
|
+
client.setSecurityTags('(public,user_42)'); // must be same than those used at generation-time
|
748
|
+
|
749
|
+
var index = client.initIndex('indexName')
|
750
|
+
|
751
|
+
index.search('something', function(err, content) {
|
752
|
+
if (err) {
|
753
|
+
console.error(err);
|
754
|
+
return;
|
755
|
+
}
|
756
|
+
|
757
|
+
console.log(content);
|
758
|
+
});
|
752
759
|
</script>
|
753
760
|
```
|
754
761
|
|
@@ -761,16 +768,28 @@ You can mix rate limits and secured API keys by setting an extra `user_token` at
|
|
761
768
|
public_key = Algolia.generate_secured_api_key 'YourRateLimitedApiKey', '(public,user_42)', 'user_42'
|
762
769
|
```
|
763
770
|
|
764
|
-
This public API key
|
771
|
+
This public API key can then be used in your JavaScript code as follow:
|
765
772
|
|
766
773
|
```javascript
|
767
774
|
<script type="text/javascript">
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
775
|
+
var client = algoliasearch('YourApplicationID', '<%= public_api_key %>');
|
776
|
+
|
777
|
+
// must be same than those used at generation-time
|
778
|
+
client.setSecurityTags('(public,user_42)');
|
779
|
+
|
780
|
+
// must be same than the one used at generation-time
|
781
|
+
client.setUserToken('user_42');
|
782
|
+
|
783
|
+
var index = client.initIndex('indexName')
|
784
|
+
|
785
|
+
index.search('another query', function(err, content) {
|
786
|
+
if (err) {
|
787
|
+
console.error(err);
|
788
|
+
return;
|
789
|
+
}
|
790
|
+
|
791
|
+
console.log(content);
|
792
|
+
});
|
774
793
|
</script>
|
775
794
|
```
|
776
795
|
|
data/lib/algolia/client.rb
CHANGED
@@ -10,20 +10,26 @@ module Algolia
|
|
10
10
|
# A class which encapsulates the HTTPS communication with the Algolia
|
11
11
|
# API server. Uses the HTTPClient library for low-level HTTP communication.
|
12
12
|
class Client
|
13
|
-
attr_reader :ssl, :ssl_version, :hosts, :search_hosts, :application_id, :api_key, :headers, :connect_timeout, :send_timeout, :receive_timeout, :search_timeout
|
13
|
+
attr_reader :ssl, :ssl_version, :hosts, :search_hosts, :application_id, :api_key, :headers, :connect_timeout, :send_timeout, :receive_timeout, :search_timeout, :batch_timeout
|
14
14
|
|
15
|
+
DEFAULT_CONNECT_TIMEOUT = 2
|
16
|
+
DEFAULT_RECEIVE_TIMEOUT = 30
|
17
|
+
DEFAULT_SEND_TIMEOUT = 30
|
18
|
+
DEFAULT_BATCH_TIMEOUT = 120
|
19
|
+
DEFAULT_SEARCH_TIMEOUT = 5
|
15
20
|
|
16
21
|
def initialize(data = {})
|
17
22
|
@ssl = data[:ssl].nil? ? true : data[:ssl]
|
18
23
|
@ssl_version = data[:ssl_version].nil? ? nil : data[:ssl_version]
|
19
24
|
@application_id = data[:application_id]
|
20
25
|
@api_key = data[:api_key]
|
21
|
-
@hosts = data[:hosts] || (["#{@application_id}.algolia.net"] + 1.upto(3).map { |i| "#{@application_id}-#{i}.
|
22
|
-
@search_hosts = data[:search_hosts] || (["#{@application_id}-dsn.algolia.net"] + 1.upto(3).map { |i| "#{@application_id}-#{i}.
|
23
|
-
@connect_timeout = data[:connect_timeout]
|
24
|
-
@send_timeout = data[:send_timeout]
|
25
|
-
@
|
26
|
-
@
|
26
|
+
@hosts = data[:hosts] || (["#{@application_id}.algolia.net"] + 1.upto(3).map { |i| "#{@application_id}-#{i}.algolianet.com" }.shuffle)
|
27
|
+
@search_hosts = data[:search_hosts] || data[:hosts] || (["#{@application_id}-dsn.algolia.net"] + 1.upto(3).map { |i| "#{@application_id}-#{i}.algolianet.com" }.shuffle)
|
28
|
+
@connect_timeout = data[:connect_timeout] || DEFAULT_CONNECT_TIMEOUT
|
29
|
+
@send_timeout = data[:send_timeout] || DEFAULT_SEND_TIMEOUT
|
30
|
+
@batch_timeout = data[:batch_timeout] || DEFAULT_BATCH_TIMEOUT
|
31
|
+
@receive_timeout = data[:receive_timeout] || DEFAULT_RECEIVE_TIMEOUT
|
32
|
+
@search_timeout = data[:search_timeout] || DEFAULT_SEARCH_TIMEOUT
|
27
33
|
@headers = {
|
28
34
|
Protocol::HEADER_API_KEY => api_key,
|
29
35
|
Protocol::HEADER_APP_ID => application_id,
|
@@ -36,9 +42,26 @@ module Algolia
|
|
36
42
|
# with common basic response handling. Will raise a
|
37
43
|
# AlgoliaProtocolError if the response has an error status code,
|
38
44
|
# and will return the parsed JSON body on success, if there is one.
|
39
|
-
def request(uri, method, data = nil,
|
45
|
+
def request(uri, method, data = nil, type = :write)
|
40
46
|
exceptions = []
|
41
|
-
|
47
|
+
|
48
|
+
connect_timeout = @connect_timeout
|
49
|
+
send_timeout = if type == :search
|
50
|
+
@search_timeout
|
51
|
+
elsif type == :batch
|
52
|
+
type = :write
|
53
|
+
@batch_timeout
|
54
|
+
else
|
55
|
+
@send_timeout
|
56
|
+
end
|
57
|
+
receive_timeout = type == :search ? @search_timeout : @receive_timeout
|
58
|
+
|
59
|
+
(type == :write ? @hosts : @search_hosts).size.times do |i|
|
60
|
+
connect_timeout += 2 if i == 2
|
61
|
+
send_timeout += 10 if i == 2
|
62
|
+
receive_timeout += 10 if i == 2
|
63
|
+
|
64
|
+
host = thread_local_hosts(type != :write, connect_timeout, send_timeout, receive_timeout)[i]
|
42
65
|
begin
|
43
66
|
return perform_request(host[:session], host[:base_url] + uri, method, data)
|
44
67
|
rescue AlgoliaProtocolError => e
|
@@ -51,20 +74,20 @@ module Algolia
|
|
51
74
|
raise AlgoliaProtocolError.new(0, "Cannot reach any host: #{exceptions.map { |e| e.to_s }.join(', ')}")
|
52
75
|
end
|
53
76
|
|
54
|
-
def get(uri,
|
55
|
-
request(uri, :GET, nil,
|
77
|
+
def get(uri, type = :write)
|
78
|
+
request(uri, :GET, nil, type)
|
56
79
|
end
|
57
80
|
|
58
|
-
def post(uri, body = {},
|
59
|
-
request(uri, :POST, body,
|
81
|
+
def post(uri, body = {}, type = :write)
|
82
|
+
request(uri, :POST, body, type)
|
60
83
|
end
|
61
84
|
|
62
|
-
def put(uri, body = {},
|
63
|
-
request(uri, :PUT, body,
|
85
|
+
def put(uri, body = {}, type = :write)
|
86
|
+
request(uri, :PUT, body, type)
|
64
87
|
end
|
65
88
|
|
66
|
-
def delete(uri,
|
67
|
-
request(uri, :DELETE, nil,
|
89
|
+
def delete(uri, type = :write)
|
90
|
+
request(uri, :DELETE, nil, type)
|
68
91
|
end
|
69
92
|
|
70
93
|
private
|
@@ -75,10 +98,10 @@ module Algolia
|
|
75
98
|
# if you change any of its attributes, we cannot change the timeout
|
76
99
|
# of an HTTP session dynamically. That being said, having 1 pool per
|
77
100
|
# timeout appears to be the only acceptable solution
|
78
|
-
def thread_local_hosts(read,
|
79
|
-
|
80
|
-
Thread.current[
|
81
|
-
Thread.current[
|
101
|
+
def thread_local_hosts(read, connect_timeout, send_timeout, receive_timeout)
|
102
|
+
thread_local_var = read ? :algolia_search_hosts : :algolia_hosts
|
103
|
+
Thread.current[thread_local_var] ||= {}
|
104
|
+
Thread.current[thread_local_var]["#{connect_timeout}-#{send_timeout}-#{receive_timeout}"] ||= (read ? search_hosts : hosts).map do |host|
|
82
105
|
client = HTTPClient.new
|
83
106
|
client.ssl_config.ssl_version = @ssl_version if @ssl && @ssl_version
|
84
107
|
hinfo = {
|
@@ -86,13 +109,9 @@ module Algolia
|
|
86
109
|
:session => client
|
87
110
|
}
|
88
111
|
hinfo[:session].transparent_gzip_decompression = true
|
89
|
-
hinfo[:session].connect_timeout =
|
90
|
-
|
91
|
-
|
92
|
-
else
|
93
|
-
hinfo[:session].send_timeout = @send_timeout if @send_timeout
|
94
|
-
hinfo[:session].receive_timeout = @receive_timeout if @receive_timeout
|
95
|
-
end
|
112
|
+
hinfo[:session].connect_timeout = connect_timeout
|
113
|
+
hinfo[:session].send_timeout = send_timeout
|
114
|
+
hinfo[:session].receive_timeout = receive_timeout
|
96
115
|
hinfo[:session].ssl_config.add_trust_ca File.join(File.dirname(__FILE__), '..', '..', 'resources', 'ca-bundle.crt')
|
97
116
|
hinfo
|
98
117
|
end
|
@@ -210,7 +229,7 @@ module Algolia
|
|
210
229
|
{ :indexName => indexName, :params => Protocol.to_query(encoded_params) }
|
211
230
|
end
|
212
231
|
}
|
213
|
-
Algolia.client.post(Protocol.multiple_queries_uri, requests.to_json,
|
232
|
+
Algolia.client.post(Protocol.multiple_queries_uri, requests.to_json, :search)
|
214
233
|
end
|
215
234
|
|
216
235
|
#
|
@@ -220,7 +239,7 @@ module Algolia
|
|
220
239
|
# {"name": "notes", "createdAt": "2013-01-18T15:33:13.556Z"}]}
|
221
240
|
#
|
222
241
|
def Algolia.list_indexes
|
223
|
-
Algolia.client.get(Protocol.indexes_uri)
|
242
|
+
Algolia.client.get(Protocol.indexes_uri, :read)
|
224
243
|
end
|
225
244
|
|
226
245
|
#
|
@@ -296,12 +315,12 @@ module Algolia
|
|
296
315
|
|
297
316
|
# List all existing user keys with their associated ACLs
|
298
317
|
def Algolia.list_user_keys
|
299
|
-
Algolia.client.get(Protocol.keys_uri)
|
318
|
+
Algolia.client.get(Protocol.keys_uri, :read)
|
300
319
|
end
|
301
320
|
|
302
321
|
# Get ACL of a user key
|
303
322
|
def Algolia.get_user_key(key)
|
304
|
-
Algolia.client.get(Protocol.key_uri(key))
|
323
|
+
Algolia.client.get(Protocol.key_uri(key), :read)
|
305
324
|
end
|
306
325
|
|
307
326
|
#
|
data/lib/algolia/index.rb
CHANGED
@@ -136,7 +136,7 @@ module Algolia
|
|
136
136
|
# one is kept and others are removed.
|
137
137
|
def search(query, params = {})
|
138
138
|
encoded_params = Hash[params.map { |k,v| [k.to_s, v.is_a?(Array) ? v.to_json : v] }]
|
139
|
-
Algolia.client.get(Protocol.search_uri(name, query, encoded_params),
|
139
|
+
Algolia.client.get(Protocol.search_uri(name, query, encoded_params), :search)
|
140
140
|
end
|
141
141
|
|
142
142
|
#
|
@@ -147,7 +147,7 @@ module Algolia
|
|
147
147
|
# @param hitsPerPage: Pagination parameter used to select the number of hits per page. Defaults to 1000.
|
148
148
|
#
|
149
149
|
def browse(page = 0, hitsPerPage = 1000)
|
150
|
-
Algolia.client.get(Protocol.browse_uri(name, {:page => page, :hitsPerPage => hitsPerPage}))
|
150
|
+
Algolia.client.get(Protocol.browse_uri(name, {:page => page, :hitsPerPage => hitsPerPage}), :read)
|
151
151
|
end
|
152
152
|
|
153
153
|
#
|
@@ -158,9 +158,9 @@ module Algolia
|
|
158
158
|
#
|
159
159
|
def get_object(objectID, attributesToRetrieve = nil)
|
160
160
|
if attributesToRetrieve.nil?
|
161
|
-
Algolia.client.get(Protocol.object_uri(name, objectID, nil),
|
161
|
+
Algolia.client.get(Protocol.object_uri(name, objectID, nil), :read)
|
162
162
|
else
|
163
|
-
Algolia.client.get(Protocol.object_uri(name, objectID, {:attributes => attributesToRetrieve}),
|
163
|
+
Algolia.client.get(Protocol.object_uri(name, objectID, {:attributes => attributesToRetrieve}), :read)
|
164
164
|
end
|
165
165
|
end
|
166
166
|
|
@@ -170,7 +170,7 @@ module Algolia
|
|
170
170
|
# @param objectIDs the array of unique identifier of the objects to retrieve
|
171
171
|
#
|
172
172
|
def get_objects(objectIDs)
|
173
|
-
Algolia.client.post(Protocol.objects_uri, { :requests => objectIDs.map { |objectID| { :indexName => name, :objectID => objectID } } }.to_json,
|
173
|
+
Algolia.client.post(Protocol.objects_uri, { :requests => objectIDs.map { |objectID| { :indexName => name, :objectID => objectID } } }.to_json, :read)['results']
|
174
174
|
end
|
175
175
|
|
176
176
|
# Wait the publication of a task on the server.
|
@@ -181,7 +181,7 @@ module Algolia
|
|
181
181
|
#
|
182
182
|
def wait_task(taskID, timeBeforeRetry = 100)
|
183
183
|
loop do
|
184
|
-
status = Algolia.client.get(Protocol.task_uri(name, taskID),
|
184
|
+
status = Algolia.client.get(Protocol.task_uri(name, taskID), :read)["status"]
|
185
185
|
if status == "published"
|
186
186
|
return
|
187
187
|
end
|
@@ -416,17 +416,17 @@ module Algolia
|
|
416
416
|
|
417
417
|
# Get settings of this index
|
418
418
|
def get_settings
|
419
|
-
Algolia.client.get(Protocol.settings_uri(name))
|
419
|
+
Algolia.client.get(Protocol.settings_uri(name), :read)
|
420
420
|
end
|
421
421
|
|
422
422
|
# List all existing user keys with their associated ACLs
|
423
423
|
def list_user_keys
|
424
|
-
Algolia.client.get(Protocol.index_keys_uri(name))
|
424
|
+
Algolia.client.get(Protocol.index_keys_uri(name), :read)
|
425
425
|
end
|
426
426
|
|
427
427
|
# Get ACL of a user key
|
428
428
|
def get_user_key(key)
|
429
|
-
Algolia.client.get(Protocol.index_key_uri(name, key))
|
429
|
+
Algolia.client.get(Protocol.index_key_uri(name, key), :read)
|
430
430
|
end
|
431
431
|
|
432
432
|
#
|
@@ -473,7 +473,7 @@ module Algolia
|
|
473
473
|
|
474
474
|
# Send a batch request
|
475
475
|
def batch(request)
|
476
|
-
Algolia.client.post(Protocol.batch_uri(name), request.to_json)
|
476
|
+
Algolia.client.post(Protocol.batch_uri(name), request.to_json, :batch)
|
477
477
|
end
|
478
478
|
|
479
479
|
# Send a batch request and wait the end of the indexing
|
data/lib/algolia/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: algoliasearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Algolia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpclient
|