trample_search 0.16.0 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trample/backend/searchkick.rb +43 -7
- data/lib/trample/metadata.rb +2 -0
- data/lib/trample/search.rb +13 -11
- data/lib/trample/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: d6aae72f53b824559e0bcf84a7c544737bc8b180
|
4
|
+
data.tar.gz: 50bca159319464c8cc994d0f87b7aec131b279c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da90c4512a189ee0909d685eed2b4ea4e4f90408925efaa03dd78584055f07ae5c01f17b98052f11aa3207203e1320b885d419a99d59a7753f1ea23a8bf100b0
|
7
|
+
data.tar.gz: 5bc12aaff9e5665ec1b50c86272495d85622d016bee5c81cbb7fd3a03a0c8ce9ef3289fb4628d6ed44cdb519463855f92d2d35bf3e4123a887757bf21fea7eba
|
@@ -10,19 +10,55 @@ module Trample
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def query!(conditions, aggregations)
|
13
|
-
|
14
|
-
results = @_models.first.search(keywords(conditions), query)
|
15
|
-
parse_response_aggs!(results.aggs, aggregations) if results.response.has_key?('aggregations')
|
13
|
+
results = resume_or_execute(conditions, aggregations)
|
16
14
|
|
17
15
|
{
|
18
|
-
total:
|
19
|
-
took:
|
20
|
-
results:
|
16
|
+
total: results.total_count,
|
17
|
+
took: results.response['took'],
|
18
|
+
results: results.results,
|
19
|
+
scroll_id: results.response['_scroll_id']
|
21
20
|
}
|
22
21
|
end
|
23
22
|
|
23
|
+
# There are 3 types of searches
|
24
|
+
#
|
25
|
+
# * A) Vanilla
|
26
|
+
# * B) Vanilla, but tell ES we are scrolling
|
27
|
+
# * C) A scroll search, using the scroll_id from B
|
28
|
+
def resume_or_execute(conditions, aggregations)
|
29
|
+
payload = build_payload(conditions, aggregations, @metadata, @_models)
|
30
|
+
query = ::Searchkick::Query.new(@_models.first, keywords(conditions), payload)
|
31
|
+
|
32
|
+
response = if @metadata.scroll_id
|
33
|
+
resume_search(@metadata.scroll_id)
|
34
|
+
else
|
35
|
+
execute_search(query)
|
36
|
+
end
|
37
|
+
results = query.handle_response(response)
|
38
|
+
parse_response_aggs!(results.aggs, aggregations) if results.response.has_key?('aggregations')
|
39
|
+
results
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute_search(query)
|
43
|
+
search_params = raw_search_params(query, scroll: @metadata.scroll)
|
44
|
+
::Searchkick.client.search(search_params)
|
45
|
+
end
|
46
|
+
|
24
47
|
private
|
25
48
|
|
49
|
+
def resume_search(scroll_id)
|
50
|
+
search_params = { scroll_id: scroll_id, scroll: '1m' }
|
51
|
+
::Searchkick.client.scroll(search_params)
|
52
|
+
end
|
53
|
+
|
54
|
+
def raw_search_params(query, scroll: false)
|
55
|
+
query.params.tap do |search_params|
|
56
|
+
if scroll
|
57
|
+
search_params[:scroll] = '5m'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
26
62
|
def keywords(conditions)
|
27
63
|
if conditions[:keywords] and conditions[:keywords].values.first != ''
|
28
64
|
conditions[:keywords].values.first
|
@@ -31,7 +67,7 @@ module Trample
|
|
31
67
|
end
|
32
68
|
end
|
33
69
|
|
34
|
-
def
|
70
|
+
def build_payload(conditions, aggregations, metadata, models)
|
35
71
|
clauses = build_condition_clauses(conditions, aggregations)
|
36
72
|
query = searchkick_payload(conditions[:keywords], clauses, metadata, aggregations)
|
37
73
|
query.merge!(index_name: models.map { |m| m.searchkick_index.name }) if models.length > 1
|
data/lib/trample/metadata.rb
CHANGED
@@ -33,6 +33,8 @@ module Trample
|
|
33
33
|
attribute :pagination, Pagination, default: ->(_,_) { Pagination.new }
|
34
34
|
attribute :took, Integer
|
35
35
|
attribute :sort, Array[Sort]
|
36
|
+
attribute :scroll, Boolean, default: false
|
37
|
+
attribute :scroll_id, String
|
36
38
|
|
37
39
|
def_delegators :pagination, :total, :current_page, :per_page
|
38
40
|
def_delegator :sort, :att, :sort_att
|
data/lib/trample/search.rb
CHANGED
@@ -137,6 +137,7 @@ module Trample
|
|
137
137
|
@records = nil
|
138
138
|
hash = backend.query!(conditions, aggregations)
|
139
139
|
self.metadata.took = hash[:took]
|
140
|
+
self.metadata.scroll_id = hash[:scroll_id]
|
140
141
|
self.metadata.pagination.total = hash[:total]
|
141
142
|
self.results = hash[:results]
|
142
143
|
if !!metadata.records[:load]
|
@@ -166,21 +167,22 @@ module Trample
|
|
166
167
|
records
|
167
168
|
end
|
168
169
|
|
169
|
-
#
|
170
|
-
#
|
171
|
-
#In future versions we hope to replace this with elastic in-built implementation
|
170
|
+
# Uses elasticsearch scroll, as ES will blow up > 10_000 results,
|
171
|
+
# even if you are paginating.
|
172
172
|
#
|
173
|
+
# 1. Execute a search, telling ES we are scrolling
|
174
|
+
# 2. metadata.scroll_id is set on response
|
175
|
+
# 3. Use the scroll_id to fetch the next resultset
|
176
|
+
# 4. Repeat until results are exhausted
|
173
177
|
def find_in_batches(batch_size: 10_000)
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
+
metadata.scroll = true
|
179
|
+
metadata.pagination.per_page = batch_size
|
180
|
+
query!
|
181
|
+
while !self.results.empty?
|
182
|
+
yield self.results
|
178
183
|
query!
|
179
|
-
yield results
|
180
|
-
offset = metadata.pagination.current_page * metadata.pagination.per_page
|
181
|
-
break unless metadata.pagination.next?
|
182
|
-
page_number += 1
|
183
184
|
end
|
185
|
+
self.metadata = Metadata.new
|
184
186
|
end
|
185
187
|
|
186
188
|
private
|
data/lib/trample/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trample_search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- richmolj
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|