search_flip 2.0.0.beta6 → 2.0.0.beta7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/README.md +2 -0
- data/lib/search_flip/connection.rb +49 -0
- data/lib/search_flip/index.rb +50 -0
- data/lib/search_flip/version.rb +1 -1
- data/spec/search_flip/bulk_spec.rb +7 -3
- data/spec/search_flip/connection_spec.rb +57 -0
- data/spec/search_flip/index_spec.rb +56 -0
- data/spec/spec_helper.rb +4 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf6b3a5f6bfc602628bc76ea55253357e36fde027c3b203c4755c7521694241d
|
4
|
+
data.tar.gz: de3a3de47e38a52bf780cc0d51f3dbf22287f57864ac99888832145b22d556ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ec3e29db16f930294bd138196c12dbb52be7ceb5ab6198964a7910ad88dd791d4c6ff689758587c29e113d20b05fa5a75d717b0524e482052ee1cca629d466a
|
7
|
+
data.tar.gz: f0cd3bf68475fbd49d2e977e503029022104425f909bf21299319cd70e78a8cceddef102523d9b3c563954f9294eb0da704c8bc5ed7b9946b8e7abf370f3b5a2
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -30,6 +30,17 @@ module SearchFlip
|
|
30
30
|
@version ||= http_client.headers(accept: "application/json").get("#{base_url}/").parse["version"]["number"]
|
31
31
|
end
|
32
32
|
|
33
|
+
# Queries and returns the ElasticSearch cluster health.
|
34
|
+
#
|
35
|
+
# @example
|
36
|
+
# connection.cluster_health # => { "status" => "green", ... }
|
37
|
+
#
|
38
|
+
# @return [Hash] The raw response
|
39
|
+
|
40
|
+
def cluster_health
|
41
|
+
http_client.headers(accept: "application/json").get("#{base_url}/_cluster/health").parse
|
42
|
+
end
|
43
|
+
|
33
44
|
# Uses the ElasticSearch Multi Search API to execute multiple search requests
|
34
45
|
# within a single request. Raises SearchFlip::ResponseError in case any
|
35
46
|
# errors occur.
|
@@ -83,6 +94,18 @@ module SearchFlip
|
|
83
94
|
.parse
|
84
95
|
end
|
85
96
|
|
97
|
+
# Sends an analyze request to ElasticSearch. Raises
|
98
|
+
# SearchFlip::ResponseError in case any errors occur.
|
99
|
+
#
|
100
|
+
# @example
|
101
|
+
# connection.analyze(analyzer: "standard", text: "this is a test")
|
102
|
+
#
|
103
|
+
# @return [Hash] The raw response
|
104
|
+
|
105
|
+
def analyze(request, params = {})
|
106
|
+
http_client.headers(accept: "application/json").post("#{base_url}/_analyze", json: request, params: params).parse
|
107
|
+
end
|
108
|
+
|
86
109
|
# Fetches information about the specified index aliases. Raises
|
87
110
|
# SearchFlip::ResponseError in case any errors occur.
|
88
111
|
#
|
@@ -157,6 +180,32 @@ module SearchFlip
|
|
157
180
|
true
|
158
181
|
end
|
159
182
|
|
183
|
+
# Closes the specified index within ElasticSearch. Raises
|
184
|
+
# SearchFlip::ResponseError in case any errors occur
|
185
|
+
#
|
186
|
+
# @param index_name [String] The index name
|
187
|
+
#
|
188
|
+
# @return [Boolean] Returns true or raises SearchFlip::ResponseError
|
189
|
+
|
190
|
+
def close_index(index_name)
|
191
|
+
http_client.post("#{index_url(index_name)}/_close")
|
192
|
+
|
193
|
+
true
|
194
|
+
end
|
195
|
+
|
196
|
+
# Opens the specified index within ElasticSearch. Raises
|
197
|
+
# SearchFlip::ResponseError in case any errors occur
|
198
|
+
#
|
199
|
+
# @param index_name [String] The index name
|
200
|
+
#
|
201
|
+
# @return [Boolean] Returns true or raises SearchFlip::ResponseError
|
202
|
+
|
203
|
+
def open_index(index_name)
|
204
|
+
http_client.post("#{index_url(index_name)}/_open")
|
205
|
+
|
206
|
+
true
|
207
|
+
end
|
208
|
+
|
160
209
|
# Updates the index settings within ElasticSearch according to the index
|
161
210
|
# settings specified. Raises SearchFlip::ResponseError in case any
|
162
211
|
# errors occur.
|
data/lib/search_flip/index.rb
CHANGED
@@ -338,6 +338,24 @@ module SearchFlip
|
|
338
338
|
connection.create_index(index_name_with_prefix, json)
|
339
339
|
end
|
340
340
|
|
341
|
+
# Closes the index within ElasticSearch. Raises SearchFlip::ResponseError
|
342
|
+
# in case any errors occur.
|
343
|
+
#
|
344
|
+
# @return [Boolean] Returns true or raises SearchFlip::ResponseError
|
345
|
+
|
346
|
+
def close_index
|
347
|
+
connection.close_index(index_name_with_prefix)
|
348
|
+
end
|
349
|
+
|
350
|
+
# Opens the index within ElasticSearch. Raises SearchFlip::ResponseError
|
351
|
+
# in case any errors occur.
|
352
|
+
#
|
353
|
+
# @return [Boolean] Returns true or raises SearchFlip::ResponseError
|
354
|
+
|
355
|
+
def open_index
|
356
|
+
connection.open_index(index_name_with_prefix)
|
357
|
+
end
|
358
|
+
|
341
359
|
# Updates the index settings within ElasticSearch according to the index
|
342
360
|
# settings specified. Raises SearchFlip::ResponseError in case any
|
343
361
|
# errors occur.
|
@@ -396,6 +414,10 @@ module SearchFlip
|
|
396
414
|
# SearchFlip::ResponseError specific exceptions in case any errors
|
397
415
|
# occur.
|
398
416
|
#
|
417
|
+
# @example
|
418
|
+
# UserIndex.get(1)
|
419
|
+
# UserIndex.get(1, routing: "key")
|
420
|
+
#
|
399
421
|
# @param id [String, Fixnum] The id to get
|
400
422
|
# @param params [Hash] Optional params for the request
|
401
423
|
#
|
@@ -405,6 +427,34 @@ module SearchFlip
|
|
405
427
|
connection.http_client.headers(accept: "application/json").get("#{type_url}/#{id}", params: params).parse
|
406
428
|
end
|
407
429
|
|
430
|
+
# Retrieves the documents specified by ids from elasticsearch.
|
431
|
+
#
|
432
|
+
# @example
|
433
|
+
# UserIndex.mget(ids: [1, 2, 3])
|
434
|
+
# UserIndex.mget(docs: [{ _id: 1, routing: "key1" }, { _id: 2, routing: "key2" }])
|
435
|
+
# UserIndex.mget({ ids: [1, 2, 3] }, stored_fields: "username,full_name")
|
436
|
+
#
|
437
|
+
# @param request [Hash] The raw request
|
438
|
+
# @param params [Hash] Optional params for the request
|
439
|
+
#
|
440
|
+
# @return [Hash] The raw response
|
441
|
+
|
442
|
+
def mget(request, params = {})
|
443
|
+
connection.http_client.headers(accept: "application/json").post("#{type_url}/_mget", json: request, params: params).parse
|
444
|
+
end
|
445
|
+
|
446
|
+
# Sends an analyze request to ElasticSearch. Raises
|
447
|
+
# SearchFlip::ResponseError in case any errors occur.
|
448
|
+
#
|
449
|
+
# @example
|
450
|
+
# CommentIndex.analyze(analyzer: "standard", text: "this is a test")
|
451
|
+
#
|
452
|
+
# @return [Hash] The raw response
|
453
|
+
|
454
|
+
def analyze(request, params = {})
|
455
|
+
connection.http_client.headers(accept: "application/json").post("#{index_url}/_analyze", json: request, params: params).parse
|
456
|
+
end
|
457
|
+
|
408
458
|
# Sends a index refresh request to ElasticSearch. Raises
|
409
459
|
# SearchFlip::ResponseError in case any errors occur.
|
410
460
|
|
data/lib/search_flip/version.rb
CHANGED
@@ -82,17 +82,21 @@ RSpec.describe SearchFlip::Bulk do
|
|
82
82
|
|
83
83
|
block = lambda do
|
84
84
|
ProductIndex.bulk bulk_max_mb: 1_000 do |bulk|
|
85
|
-
|
85
|
+
20.times do
|
86
86
|
bulk.index product.id, ProductIndex.serialize(product)
|
87
87
|
end
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
-
|
91
|
+
if ProductIndex.connection.version.to_i <= 2
|
92
|
+
expect(&block).to raise_error(SearchFlip::ConnectionError)
|
93
|
+
else
|
94
|
+
expect(&block).to raise_error(SearchFlip::ResponseError)
|
95
|
+
end
|
92
96
|
|
93
97
|
block = lambda do
|
94
98
|
ProductIndex.bulk bulk_max_mb: 100 do |bulk|
|
95
|
-
|
99
|
+
20.times do
|
96
100
|
bulk.index product.id, ProductIndex.serialize(product)
|
97
101
|
end
|
98
102
|
end
|
@@ -2,6 +2,18 @@
|
|
2
2
|
require File.expand_path("../spec_helper", __dir__)
|
3
3
|
|
4
4
|
RSpec.describe SearchFlip::Connection do
|
5
|
+
describe "#version" do
|
6
|
+
it "returns the version" do
|
7
|
+
expect(SearchFlip::Connection.new.version).to match(/\A[0-9.]+\z/)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#cluster_health" do
|
12
|
+
it "returns the cluster health" do
|
13
|
+
expect(["red", "yellow", "green"]).to include(SearchFlip::Connection.new.cluster_health["status"])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
5
17
|
describe "#base_url" do
|
6
18
|
it "returns the correct url" do
|
7
19
|
expect(SearchFlip::Connection.new(base_url: "base url").base_url).to eq("base url")
|
@@ -112,6 +124,51 @@ RSpec.describe SearchFlip::Connection do
|
|
112
124
|
end
|
113
125
|
end
|
114
126
|
|
127
|
+
describe "#close_index" do
|
128
|
+
it "closes the specified index" do
|
129
|
+
begin
|
130
|
+
connection = SearchFlip::Connection.new
|
131
|
+
|
132
|
+
connection.create_index("index_name")
|
133
|
+
sleep(0.1) while connection.cluster_health["status"] == "red"
|
134
|
+
|
135
|
+
connection.close_index("index_name")
|
136
|
+
|
137
|
+
expect(connection.get_indices("index_name").first["status"]).to eq("close")
|
138
|
+
ensure
|
139
|
+
connection.delete_index("index_name") if connection.index_exists?("index_name")
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "#open_index" do
|
145
|
+
it "opens the specified index" do
|
146
|
+
begin
|
147
|
+
connection = SearchFlip::Connection.new
|
148
|
+
|
149
|
+
connection.create_index("index_name")
|
150
|
+
sleep(0.1) while connection.cluster_health["status"] == "red"
|
151
|
+
connection.close_index("index_name")
|
152
|
+
|
153
|
+
connection.open_index("index_name")
|
154
|
+
|
155
|
+
expect(connection.get_indices("index_name").first["status"]).to eq("open")
|
156
|
+
ensure
|
157
|
+
connection.delete_index("index_name") if connection.index_exists?("index_name")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe ".analyze" do
|
163
|
+
it "analyzes the provided request" do
|
164
|
+
connection = SearchFlip::Connection.new
|
165
|
+
|
166
|
+
tokens = connection.analyze(analyzer: "standard", text: "some text")["tokens"].map { |token| token["token"] }
|
167
|
+
|
168
|
+
expect(tokens).to include("some", "text")
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
115
172
|
describe "#update_index_settings" do
|
116
173
|
it "updates the index settings" do
|
117
174
|
begin
|
@@ -82,6 +82,32 @@ RSpec.describe SearchFlip::Index do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
describe ".close_index" do
|
86
|
+
it "delegates to connection" do
|
87
|
+
allow(TestIndex.connection).to receive(:close_index).and_call_original
|
88
|
+
|
89
|
+
TestIndex.create_index
|
90
|
+
sleep(0.1) while TestIndex.connection.cluster_health["status"] == "red"
|
91
|
+
TestIndex.close_index
|
92
|
+
|
93
|
+
expect(TestIndex.connection).to have_received(:close_index).with("test")
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe ".open_index" do
|
98
|
+
it "delegates to connection" do
|
99
|
+
allow(TestIndex.connection).to receive(:open_index).and_call_original
|
100
|
+
|
101
|
+
TestIndex.create_index
|
102
|
+
sleep(0.1) while TestIndex.connection.cluster_health["status"] == "red"
|
103
|
+
TestIndex.close_index
|
104
|
+
|
105
|
+
TestIndex.open_index
|
106
|
+
|
107
|
+
expect(TestIndex.connection).to have_received(:open_index).with("test")
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
85
111
|
describe ".index_exists?" do
|
86
112
|
it "delegates to connection" do
|
87
113
|
TestIndex.create_index
|
@@ -161,6 +187,16 @@ RSpec.describe SearchFlip::Index do
|
|
161
187
|
end
|
162
188
|
end
|
163
189
|
|
190
|
+
describe ".analyze" do
|
191
|
+
it "analyzes the provided request" do
|
192
|
+
ProductIndex.import create(:product)
|
193
|
+
|
194
|
+
tokens = ProductIndex.analyze(analyzer: "standard", text: "some text")["tokens"].map { |token| token["token"] }
|
195
|
+
|
196
|
+
expect(tokens).to include("some", "text")
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
164
200
|
describe ".refresh" do
|
165
201
|
it "delegates to connection" do
|
166
202
|
TestIndex.create_index
|
@@ -389,6 +425,7 @@ RSpec.describe SearchFlip::Index do
|
|
389
425
|
|
390
426
|
it "passes params" do
|
391
427
|
product = create(:product)
|
428
|
+
|
392
429
|
ProductIndex.import product
|
393
430
|
|
394
431
|
expect(ProductIndex.get(product.id).keys).to include("_source")
|
@@ -396,6 +433,25 @@ RSpec.describe SearchFlip::Index do
|
|
396
433
|
end
|
397
434
|
end
|
398
435
|
|
436
|
+
describe ".mget" do
|
437
|
+
it "retrieves the documents" do
|
438
|
+
product1, product2, product3 = create_list(:product, 3)
|
439
|
+
|
440
|
+
ProductIndex.import [product1, product2, product3]
|
441
|
+
|
442
|
+
expect(ProductIndex.mget(ids: [product1.id, product2.id])["docs"].map { |doc| doc["found"] }).to eq([true, true])
|
443
|
+
end
|
444
|
+
|
445
|
+
it "passes params" do
|
446
|
+
product = create(:product)
|
447
|
+
|
448
|
+
ProductIndex.import product
|
449
|
+
|
450
|
+
expect(ProductIndex.mget({ ids: [product.id] }, _source: false)["docs"].map { |doc| doc["found"] }).to eq([true])
|
451
|
+
expect(ProductIndex.mget({ ids: [product.id] }, _source: false)["docs"].first).not_to include("_source")
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
399
455
|
describe ".scope" do
|
400
456
|
it "adds a scope" do
|
401
457
|
temp_product_index = Class.new(ProductIndex)
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: search_flip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.beta7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benjamin Vetter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|