search_flip 1.1.0 → 2.0.0.beta
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 +5 -5
- data/.rubocop.yml +110 -0
- data/.travis.yml +11 -30
- data/CHANGELOG.md +17 -5
- data/README.md +32 -0
- data/docker-compose.yml +6 -0
- data/lib/search_flip.rb +2 -42
- data/lib/search_flip/aggregatable.rb +1 -1
- data/lib/search_flip/aggregation.rb +15 -9
- data/lib/search_flip/bulk.rb +8 -5
- data/lib/search_flip/config.rb +0 -11
- data/lib/search_flip/connection.rb +131 -0
- data/lib/search_flip/criteria.rb +89 -73
- data/lib/search_flip/exceptions.rb +5 -0
- data/lib/search_flip/filterable.rb +3 -1
- data/lib/search_flip/index.rb +32 -26
- data/lib/search_flip/model.rb +1 -1
- data/lib/search_flip/post_filterable.rb +5 -3
- data/lib/search_flip/response.rb +1 -1
- data/lib/search_flip/version.rb +1 -1
- data/search_flip.gemspec +10 -9
- data/test/search_flip/aggregation_test.rb +39 -21
- data/test/search_flip/bulk_test.rb +1 -1
- data/test/search_flip/connection_test.rb +70 -0
- data/test/search_flip/criteria_test.rb +87 -44
- data/test/search_flip/http_client_test.rb +1 -1
- data/test/search_flip/index_test.rb +49 -17
- data/test/search_flip/model_test.rb +1 -1
- data/test/search_flip/response_test.rb +4 -3
- data/test/search_flip/to_json_test.rb +1 -1
- data/test/test_helper.rb +5 -5
- metadata +28 -26
- data/test/database.yml +0 -4
- data/test/search_flip_test.rb +0 -26
data/lib/search_flip/criteria.rb
CHANGED
@@ -38,7 +38,7 @@ module SearchFlip
|
|
38
38
|
other = other.criteria
|
39
39
|
|
40
40
|
fresh.tap do |criteria|
|
41
|
-
criteria.profile_value = other.profile_value
|
41
|
+
criteria.profile_value = other.profile_value unless other.profile_value.nil?
|
42
42
|
criteria.source_value = (criteria.source_value || []) + other.source_value if other.source_value
|
43
43
|
criteria.sort_values = (criteria.sort_values || []) + other.sort_values if other.sort_values
|
44
44
|
criteria.highlight_values = (criteria.highlight_values || {}).merge(other.highlight_values) if other.highlight_values
|
@@ -48,7 +48,7 @@ module SearchFlip
|
|
48
48
|
criteria.includes_values = (criteria.includes_values || []) + other.includes_values if other.includes_values
|
49
49
|
criteria.preload_values = (criteria.preload_values || []) + other.preload_values if other.preload_values
|
50
50
|
criteria.eager_load_values = (criteria.eager_load_values || []) + other.eager_load_values if other.eager_load_values
|
51
|
-
criteria.failsafe_value = other.failsafe_value
|
51
|
+
criteria.failsafe_value = other.failsafe_value unless other.failsafe_value.nil?
|
52
52
|
criteria.scroll_args = other.scroll_args if other.scroll_args
|
53
53
|
criteria.custom_value = (criteria.custom_value || {}).merge(other.custom_value) if other.custom_value
|
54
54
|
criteria.search_values = (criteria.search_values || []) + other.search_values if other.search_values
|
@@ -62,8 +62,8 @@ module SearchFlip
|
|
62
62
|
criteria.post_should_values = (criteria.post_should_values || []) + other.post_should_values if other.post_should_values
|
63
63
|
criteria.post_filter_values = (criteria.post_filter_vales || []) + other.post_filter_values if other.post_filter_values
|
64
64
|
criteria.aggregation_values = (criteria.aggregation_values || {}).merge(other.aggregation_values) if other.aggregation_values
|
65
|
-
criteria.terminate_after_value = other.terminate_after_value
|
66
|
-
criteria.timeout_value = other.timeout_value
|
65
|
+
criteria.terminate_after_value = other.terminate_after_value unless other.terminate_after_value.nil?
|
66
|
+
criteria.timeout_value = other.timeout_value unless other.timeout_value.nil?
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
@@ -74,11 +74,13 @@ module SearchFlip
|
|
74
74
|
# @example
|
75
75
|
# ProductIndex.timeout("3s").search("hello world")
|
76
76
|
#
|
77
|
+
# @param value [String] The timeout value
|
78
|
+
#
|
77
79
|
# @return [SearchFlip::Criteria] A newly created extended criteria
|
78
80
|
|
79
|
-
def timeout(
|
81
|
+
def timeout(value)
|
80
82
|
fresh.tap do |criteria|
|
81
|
-
criteria.timeout_value =
|
83
|
+
criteria.timeout_value = value
|
82
84
|
end
|
83
85
|
end
|
84
86
|
|
@@ -88,11 +90,13 @@ module SearchFlip
|
|
88
90
|
# @example
|
89
91
|
# ProductIndex.terminate_after(10_000).search("hello world")
|
90
92
|
#
|
93
|
+
# @param value [Fixnum] The number of records to terminate after
|
94
|
+
#
|
91
95
|
# @return [SearchFlip::Criteria] A newly created extended criteria
|
92
96
|
|
93
|
-
def terminate_after(
|
97
|
+
def terminate_after(value)
|
94
98
|
fresh.tap do |criteria|
|
95
|
-
criteria.terminate_after_value =
|
99
|
+
criteria.terminate_after_value = value
|
96
100
|
end
|
97
101
|
end
|
98
102
|
|
@@ -141,7 +145,7 @@ module SearchFlip
|
|
141
145
|
|
142
146
|
def initialize(attributes = {})
|
143
147
|
attributes.each do |key, value|
|
144
|
-
|
148
|
+
send "#{key}=", value
|
145
149
|
end
|
146
150
|
end
|
147
151
|
|
@@ -155,30 +159,31 @@ module SearchFlip
|
|
155
159
|
res = {}
|
156
160
|
|
157
161
|
if must_values || search_values || must_not_values || should_values || filter_values
|
158
|
-
if
|
162
|
+
if target.connection.version.to_i >= 2
|
159
163
|
res[:query] = {
|
160
|
-
bool: {}
|
161
|
-
merge(must_values || search_values ? { must: (must_values || []) + (search_values || [])} : {})
|
162
|
-
merge(must_not_values ? { must_not: must_not_values } : {})
|
163
|
-
merge(should_values ? { should: should_values } : {})
|
164
|
-
merge(filter_values ? { filter: filter_values } : {})
|
164
|
+
bool: {}
|
165
|
+
.merge(must_values || search_values ? { must: (must_values || []) + (search_values || []) } : {})
|
166
|
+
.merge(must_not_values ? { must_not: must_not_values } : {})
|
167
|
+
.merge(should_values ? { should: should_values } : {})
|
168
|
+
.merge(filter_values ? { filter: filter_values } : {})
|
165
169
|
}
|
166
170
|
else
|
167
171
|
filters = (filter_values || []) + (must_not_values || []).map { |must_not_value| { not: must_not_value } }
|
168
172
|
|
169
|
-
queries = {}
|
170
|
-
merge(must_values || search_values ? { must: (must_values || []) + (search_values || []) } : {})
|
171
|
-
merge(should_values ? { should: should_values } : {})
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
173
|
+
queries = {}
|
174
|
+
.merge(must_values || search_values ? { must: (must_values || []) + (search_values || []) } : {})
|
175
|
+
.merge(should_values ? { should: should_values } : {})
|
176
|
+
|
177
|
+
res[:query] =
|
178
|
+
if filters.size > 0
|
179
|
+
{
|
180
|
+
filtered: {}
|
181
|
+
.merge(queries.size > 0 ? { query: { bool: queries } } : {})
|
182
|
+
.merge(filter: filters.size > 1 ? { and: filters } : filters.first)
|
183
|
+
}
|
184
|
+
else
|
185
|
+
{ bool: queries }
|
186
|
+
end
|
182
187
|
end
|
183
188
|
end
|
184
189
|
|
@@ -192,20 +197,20 @@ module SearchFlip
|
|
192
197
|
res[:aggregations] = aggregation_values if aggregation_values
|
193
198
|
|
194
199
|
if post_must_values || post_search_values || post_must_not_values || post_should_values || post_filter_values
|
195
|
-
if
|
200
|
+
if target.connection.version.to_i >= 2
|
196
201
|
res[:post_filter] = {
|
197
|
-
bool: {}
|
198
|
-
merge(post_must_values || post_search_values ? { must: (post_must_values || []) + (post_search_values || []) } : {})
|
199
|
-
merge(post_must_not_values ? { must_not: post_must_not_values } : {})
|
200
|
-
merge(post_should_values ? { should: post_should_values } : {})
|
201
|
-
merge(post_filter_values ? { filter: post_filter_values } : {})
|
202
|
+
bool: {}
|
203
|
+
.merge(post_must_values || post_search_values ? { must: (post_must_values || []) + (post_search_values || []) } : {})
|
204
|
+
.merge(post_must_not_values ? { must_not: post_must_not_values } : {})
|
205
|
+
.merge(post_should_values ? { should: post_should_values } : {})
|
206
|
+
.merge(post_filter_values ? { filter: post_filter_values } : {})
|
202
207
|
}
|
203
208
|
else
|
204
209
|
post_filters = (post_filter_values || []) + (post_must_not_values || []).map { |post_must_not_value| { not: post_must_not_value } }
|
205
210
|
|
206
|
-
post_queries = {}
|
207
|
-
merge(post_must_values || post_search_values ? { must: (post_must_values || []) + (post_search_values || []) } : {})
|
208
|
-
merge(post_should_values ? { should: post_should_values } : {})
|
211
|
+
post_queries = {}
|
212
|
+
.merge(post_must_values || post_search_values ? { must: (post_must_values || []) + (post_search_values || []) } : {})
|
213
|
+
.merge(post_should_values ? { should: post_should_values } : {})
|
209
214
|
|
210
215
|
post_filters_and_queries = post_filters + (post_queries.size > 0 ? [bool: post_queries] : [])
|
211
216
|
|
@@ -245,13 +250,14 @@ module SearchFlip
|
|
245
250
|
fresh.tap do |criteria|
|
246
251
|
criteria.highlight_values = (criteria.highlight_values || {}).merge(options)
|
247
252
|
|
248
|
-
hash =
|
249
|
-
fields
|
250
|
-
|
251
|
-
fields.
|
252
|
-
|
253
|
-
|
254
|
-
|
253
|
+
hash =
|
254
|
+
if fields.is_a?(Hash)
|
255
|
+
fields
|
256
|
+
elsif fields.is_a?(Array)
|
257
|
+
fields.each_with_object({}) { |field, h| h[field] = {} }
|
258
|
+
else
|
259
|
+
{ fields => {} }
|
260
|
+
end
|
255
261
|
|
256
262
|
criteria.highlight_values[:fields] = (criteria.highlight_values[:fields] || {}).merge(hash)
|
257
263
|
end
|
@@ -331,14 +337,14 @@ module SearchFlip
|
|
331
337
|
# CommentIndex.where(public: false).delete
|
332
338
|
|
333
339
|
def delete
|
334
|
-
|
335
|
-
|
336
|
-
|
340
|
+
dupped_request = request.dup
|
341
|
+
dupped_request.delete(:from)
|
342
|
+
dupped_request.delete(:size)
|
337
343
|
|
338
|
-
if
|
339
|
-
SearchFlip::HTTPClient.post("#{target.type_url}/_delete_by_query", json:
|
344
|
+
if target.connection.version.to_i >= 5
|
345
|
+
SearchFlip::HTTPClient.post("#{target.type_url}/_delete_by_query", json: dupped_request)
|
340
346
|
else
|
341
|
-
SearchFlip::HTTPClient.delete("#{target.type_url}/_query", json:
|
347
|
+
SearchFlip::HTTPClient.delete("#{target.type_url}/_query", json: dupped_request)
|
342
348
|
end
|
343
349
|
|
344
350
|
target.refresh if SearchFlip::Config[:auto_refresh]
|
@@ -504,14 +510,14 @@ module SearchFlip
|
|
504
510
|
# @example
|
505
511
|
# CommentIndex.offset(100)
|
506
512
|
#
|
507
|
-
# @param
|
513
|
+
# @param value [Fixnum] The offset value, ie the number of results that are
|
508
514
|
# skipped in the result set
|
509
515
|
#
|
510
516
|
# @return [SearchFlip::Criteria] A newly created extended criteria
|
511
517
|
|
512
|
-
def offset(
|
518
|
+
def offset(value)
|
513
519
|
fresh.tap do |criteria|
|
514
|
-
criteria.offset_value =
|
520
|
+
criteria.offset_value = value.to_i
|
515
521
|
end
|
516
522
|
end
|
517
523
|
|
@@ -529,14 +535,14 @@ module SearchFlip
|
|
529
535
|
# @example
|
530
536
|
# CommentIndex.limit(100)
|
531
537
|
#
|
532
|
-
# @param
|
538
|
+
# @param value [Fixnum] The limit value, ie the max number of results that
|
533
539
|
# should be returned
|
534
540
|
#
|
535
541
|
# @return [SearchFlip::Criteria] A newly created extended criteria
|
536
542
|
|
537
|
-
def limit(
|
543
|
+
def limit(value)
|
538
544
|
fresh.tap do |criteria|
|
539
|
-
criteria.limit_value =
|
545
|
+
criteria.limit_value = value.to_i
|
540
546
|
end
|
541
547
|
end
|
542
548
|
|
@@ -567,12 +573,12 @@ module SearchFlip
|
|
567
573
|
offset((page - 1) * per_page).limit(per_page)
|
568
574
|
end
|
569
575
|
|
570
|
-
def page(
|
571
|
-
paginate(page:
|
576
|
+
def page(value)
|
577
|
+
paginate(page: value)
|
572
578
|
end
|
573
579
|
|
574
|
-
def per(
|
575
|
-
paginate(page: offset_value_with_default / limit_value_with_default + 1, per_page:
|
580
|
+
def per(value)
|
581
|
+
paginate(page: offset_value_with_default / limit_value_with_default + 1, per_page: value)
|
576
582
|
end
|
577
583
|
|
578
584
|
# Fetches the records specified by the criteria in batches using the
|
@@ -656,29 +662,38 @@ module SearchFlip
|
|
656
662
|
# response errors will be rescued if you specify the criteria to be
|
657
663
|
# #failsafe, such that an empty response is returned instead.
|
658
664
|
#
|
659
|
-
# @param
|
660
|
-
# to for e.g. proxying
|
665
|
+
# @param connection An optional alternative connection to used to send the
|
666
|
+
# request to for e.g. proxying
|
661
667
|
#
|
662
668
|
# @example
|
663
669
|
# response = CommentIndex.search("hello world").execute
|
664
670
|
#
|
665
671
|
# @return [SearchFlip::Response] The response object
|
666
672
|
|
667
|
-
def execute(
|
673
|
+
def execute(connection: target.connection)
|
668
674
|
@response ||= begin
|
669
675
|
http_request = SearchFlip::HTTPClient.headers(accept: "application/json")
|
670
676
|
|
671
677
|
http_response =
|
672
678
|
if scroll_args && scroll_args[:id]
|
673
|
-
if
|
674
|
-
http_request.post(
|
679
|
+
if target.connection.version.to_i >= 2
|
680
|
+
http_request.post(
|
681
|
+
"#{connection.base_url}/_search/scroll",
|
682
|
+
json: { scroll: scroll_args[:timeout], scroll_id: scroll_args[:id] }
|
683
|
+
)
|
675
684
|
else
|
676
|
-
http_request
|
685
|
+
http_request
|
686
|
+
.headers(content_type: "text/plain")
|
687
|
+
.post("#{connection.base_url}/_search/scroll", params: { scroll: scroll_args[:timeout] }, body: scroll_args[:id])
|
677
688
|
end
|
678
689
|
elsif scroll_args
|
679
|
-
http_request.post(
|
690
|
+
http_request.post(
|
691
|
+
"#{target.type_url(connection: connection)}/_search",
|
692
|
+
params: { scroll: scroll_args[:timeout] },
|
693
|
+
json: request
|
694
|
+
)
|
680
695
|
else
|
681
|
-
http_request.post("#{target.type_url(
|
696
|
+
http_request.post("#{target.type_url(connection: connection)}/_search", json: request)
|
682
697
|
end
|
683
698
|
|
684
699
|
SearchFlip::Response.new(self, http_response.parse)
|
@@ -731,8 +746,8 @@ module SearchFlip
|
|
731
746
|
end
|
732
747
|
end
|
733
748
|
|
734
|
-
def
|
735
|
-
|
749
|
+
def respond_to_missing?(name, *args)
|
750
|
+
target.respond_to?(name, *args)
|
736
751
|
end
|
737
752
|
|
738
753
|
def method_missing(name, *args, &block)
|
@@ -743,8 +758,10 @@ module SearchFlip
|
|
743
758
|
end
|
744
759
|
end
|
745
760
|
|
746
|
-
def_delegators :response, :total_entries, :total_count, :current_page, :previous_page,
|
747
|
-
:
|
761
|
+
def_delegators :response, :total_entries, :total_count, :current_page, :previous_page,
|
762
|
+
:prev_page, :next_page, :first_page?, :last_page?, :out_of_range?, :total_pages,
|
763
|
+
:hits, :ids, :count, :size, :length, :took, :aggregations, :suggestions,
|
764
|
+
:scope, :results, :records, :scroll_id, :raw_response
|
748
765
|
|
749
766
|
private
|
750
767
|
|
@@ -764,4 +781,3 @@ module SearchFlip
|
|
764
781
|
end
|
765
782
|
end
|
766
783
|
end
|
767
|
-
|
@@ -31,7 +31,9 @@ module SearchFlip
|
|
31
31
|
|
32
32
|
def search(q, options = {})
|
33
33
|
fresh.tap do |criteria|
|
34
|
-
|
34
|
+
if q.to_s.strip.length > 0
|
35
|
+
criteria.search_values = (search_values || []) + [query_string: { query: q, default_operator: :AND }.merge(options)]
|
36
|
+
end
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
data/lib/search_flip/index.rb
CHANGED
@@ -88,7 +88,7 @@ module SearchFlip
|
|
88
88
|
# @return [Hash] The hash-representation of the record
|
89
89
|
|
90
90
|
def serialize(record)
|
91
|
-
raise
|
91
|
+
raise SearchFlip::MethodNotImplemented, "You must implement #{name}::serialize(record)"
|
92
92
|
end
|
93
93
|
|
94
94
|
# Adds a named scope to the index.
|
@@ -214,10 +214,13 @@ module SearchFlip
|
|
214
214
|
SearchFlip::Criteria.new(target: self)
|
215
215
|
end
|
216
216
|
|
217
|
-
def_delegators :criteria, :profile, :where, :where_not, :filter, :range, :match_all, :exists,
|
218
|
-
:
|
219
|
-
:
|
220
|
-
:
|
217
|
+
def_delegators :criteria, :profile, :where, :where_not, :filter, :range, :match_all, :exists,
|
218
|
+
:exists_not, :post_where, :post_where_not, :post_range, :post_exists, :post_exists_not,
|
219
|
+
:post_filter, :post_must, :post_must_not, :post_should, :aggregate, :scroll, :source,
|
220
|
+
:includes, :eager_load, :preload, :sort, :resort, :order, :reorder, :offset, :limit, :paginate,
|
221
|
+
:page, :per, :search, :highlight, :suggest, :custom, :find_in_batches, :find_results_in_batches,
|
222
|
+
:find_each, :failsafe, :total_entries, :total_count, :timeout, :terminate_after, :records,
|
223
|
+
:should, :should_not, :must, :must_not
|
221
224
|
|
222
225
|
# Override to specify the type name used within ElasticSearch. Recap,
|
223
226
|
# this gem uses an individual index for each index class, because
|
@@ -227,7 +230,7 @@ module SearchFlip
|
|
227
230
|
# @return [String] The name used for the type within the index
|
228
231
|
|
229
232
|
def type_name
|
230
|
-
raise
|
233
|
+
raise SearchFlip::MethodNotImplemented, "You must implement #{name}::type_name"
|
231
234
|
end
|
232
235
|
|
233
236
|
# Returns the base name of the index within ElasticSearch, ie the index
|
@@ -416,13 +419,13 @@ module SearchFlip
|
|
416
419
|
# raised. Please note that this only applies to the bulk response, not to
|
417
420
|
# the request in general, such that connection errors, etc will still
|
418
421
|
# raise.
|
419
|
-
# @param
|
422
|
+
# @param additional_index_options [Hash] Provides custom index options for eg
|
420
423
|
# routing, versioning, etc
|
421
424
|
|
422
|
-
def index(scope, options = {},
|
425
|
+
def index(scope, options = {}, additional_index_options = {})
|
423
426
|
bulk options do |indexer|
|
424
427
|
each_record(scope, index_scope: true) do |object|
|
425
|
-
indexer.index record_id(object), serialize(object), index_options(object).merge(
|
428
|
+
indexer.index record_id(object), serialize(object), index_options(object).merge(additional_index_options)
|
426
429
|
end
|
427
430
|
end
|
428
431
|
|
@@ -437,10 +440,10 @@ module SearchFlip
|
|
437
440
|
# @see #index See #index for more details regarding available
|
438
441
|
# params and return values
|
439
442
|
|
440
|
-
def create(scope, options = {},
|
443
|
+
def create(scope, options = {}, additional_index_options = {})
|
441
444
|
bulk options do |indexer|
|
442
445
|
each_record(scope, index_scope: true) do |object|
|
443
|
-
indexer.create record_id(object), serialize(object), index_options(object).merge(
|
446
|
+
indexer.create record_id(object), serialize(object), index_options(object).merge(additional_index_options)
|
444
447
|
end
|
445
448
|
end
|
446
449
|
|
@@ -455,10 +458,10 @@ module SearchFlip
|
|
455
458
|
# @see #index See #index for more details regarding available
|
456
459
|
# params and return values
|
457
460
|
|
458
|
-
def update(scope, options = {},
|
461
|
+
def update(scope, options = {}, additional_index_options = {})
|
459
462
|
bulk options do |indexer|
|
460
463
|
each_record(scope, index_scope: true) do |object|
|
461
|
-
indexer.update record_id(object), { doc: serialize(object) }, index_options(object).merge(
|
464
|
+
indexer.update record_id(object), { doc: serialize(object) }, index_options(object).merge(additional_index_options)
|
462
465
|
end
|
463
466
|
end
|
464
467
|
|
@@ -471,10 +474,10 @@ module SearchFlip
|
|
471
474
|
# @see #index See #index for more details regarding available
|
472
475
|
# params and return values
|
473
476
|
|
474
|
-
def delete(scope, options = {},
|
477
|
+
def delete(scope, options = {}, additional_index_options = {})
|
475
478
|
bulk options do |indexer|
|
476
479
|
each_record(scope) do |object|
|
477
|
-
indexer.delete record_id(object), index_options(object).merge(
|
480
|
+
indexer.delete record_id(object), index_options(object).merge(additional_index_options)
|
478
481
|
end
|
479
482
|
end
|
480
483
|
|
@@ -505,7 +508,7 @@ module SearchFlip
|
|
505
508
|
# raised. Please note that this only applies to the bulk response, not to
|
506
509
|
# the request in general, such that connection errors, etc will still
|
507
510
|
# raise.
|
508
|
-
|
511
|
+
|
509
512
|
def bulk(options = {})
|
510
513
|
SearchFlip::Bulk.new("#{type_url}/_bulk", SearchFlip::Config[:bulk_limit], options) do |indexer|
|
511
514
|
yield indexer
|
@@ -517,30 +520,33 @@ module SearchFlip
|
|
517
520
|
# Returns the full ElasticSearch type URL, ie base URL, index name with
|
518
521
|
# prefix and type name.
|
519
522
|
#
|
523
|
+
# @param connection [SearchFlip::Connection] The connection to use
|
524
|
+
#
|
520
525
|
# @return [String] The ElasticSearch type URL
|
521
526
|
|
522
|
-
def type_url(
|
523
|
-
"#{index_url(
|
527
|
+
def type_url(connection: self.connection)
|
528
|
+
"#{index_url(connection: connection)}/#{type_name}"
|
524
529
|
end
|
525
530
|
|
526
531
|
# Returns the ElasticSearch index URL, ie base URL and index name with
|
527
532
|
# prefix.
|
528
533
|
#
|
534
|
+
# @param connection [SearchFlip::Connection] The connection to use
|
535
|
+
#
|
529
536
|
# @return [String] The ElasticSearch index URL
|
530
537
|
|
531
|
-
def index_url(
|
532
|
-
"#{base_url}/#{index_name_with_prefix}"
|
538
|
+
def index_url(connection: self.connection)
|
539
|
+
"#{connection.base_url}/#{index_name_with_prefix}"
|
533
540
|
end
|
534
541
|
|
535
|
-
# Returns the
|
536
|
-
# Override to specify
|
542
|
+
# Returns the SearchFlip::Connection for the index.
|
543
|
+
# Override to specify a custom connection.
|
537
544
|
#
|
538
|
-
# @return [
|
545
|
+
# @return [SearchFlip::Connection] The connection
|
539
546
|
|
540
|
-
def
|
541
|
-
SearchFlip::Config[:base_url]
|
547
|
+
def connection
|
548
|
+
@connection ||= SearchFlip::Connection.new(base_url: SearchFlip::Config[:base_url])
|
542
549
|
end
|
543
550
|
end
|
544
551
|
end
|
545
552
|
end
|
546
|
-
|