searchkick 0.7.5 → 0.7.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +8 -0
- data/lib/searchkick/index.rb +9 -7
- data/lib/searchkick/query.rb +14 -2
- data/lib/searchkick/results.rb +6 -2
- data/lib/searchkick/version.rb +1 -1
- data/test/facets_test.rb +7 -0
- data/test/sql_test.rb +12 -7
- 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: 2d9d6517d9d49a09f8827ea95a866e4a162fa7f3
|
4
|
+
data.tar.gz: cb53edf08c5f05e95e6bb11aa2e00f010f6e2043
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a9fb661de8eaa36d5f1c979ee1bb0a3779716b4983e17d94de72883fd1a549c874cbd2a41f8498b7f4110e5d62ed7511f3d873df9a42d51aa590cf55156d72f
|
7
|
+
data.tar.gz: 000f1e7fb07a5d00659f21a8116e8fd57dcaf6b41adcc261d7687e6cccccd2edb811738c7e3552f0ac1c594dffd818ae4966cdda36ed8fe334843df1350e4137
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -108,6 +108,8 @@ Order
|
|
108
108
|
order: {_score: :desc} # most relevant first - default
|
109
109
|
```
|
110
110
|
|
111
|
+
[All of these sort options are supported](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html)
|
112
|
+
|
111
113
|
Limit / offset
|
112
114
|
|
113
115
|
```ruby
|
@@ -441,6 +443,12 @@ price_ranges = [{to: 20}, {from: 20, to: 50}, {from: 50}]
|
|
441
443
|
Product.search "*", facets: {price: {ranges: price_ranges}}
|
442
444
|
```
|
443
445
|
|
446
|
+
Use the `stats` option to get to max, min, mean, and total scores for each facet [master]
|
447
|
+
|
448
|
+
```ruby
|
449
|
+
Product.search "*", facets: {store_id: {stats: true}}
|
450
|
+
```
|
451
|
+
|
444
452
|
### Highlight
|
445
453
|
|
446
454
|
Highlight the search query in the results.
|
data/lib/searchkick/index.rb
CHANGED
@@ -44,7 +44,7 @@ module Searchkick
|
|
44
44
|
client.bulk(
|
45
45
|
index: name,
|
46
46
|
type: type,
|
47
|
-
body: batch.map{|r|
|
47
|
+
body: batch.map{|r| {index: {_id: search_id(r), data: search_data(r)}} }
|
48
48
|
)
|
49
49
|
end
|
50
50
|
end
|
@@ -58,7 +58,11 @@ module Searchkick
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def klass_document_type(klass)
|
61
|
-
klass.
|
61
|
+
if klass.respond_to?(:document_type)
|
62
|
+
klass.document_type
|
63
|
+
else
|
64
|
+
klass.model_name.to_s.underscore
|
65
|
+
end
|
62
66
|
end
|
63
67
|
|
64
68
|
protected
|
@@ -77,11 +81,11 @@ module Searchkick
|
|
77
81
|
|
78
82
|
def search_data(record)
|
79
83
|
source = record.search_data
|
84
|
+
options = record.class.searchkick_options
|
80
85
|
|
81
86
|
# stringify fields
|
82
|
-
|
83
|
-
|
84
|
-
options = record.class.searchkick_options
|
87
|
+
# remove _id since search_id is used instead
|
88
|
+
source = source.inject({}){|memo,(k,v)| memo[k.to_s] = v; memo}.except("_id")
|
85
89
|
|
86
90
|
# conversions
|
87
91
|
conversions_field = options[:conversions]
|
@@ -107,8 +111,6 @@ module Searchkick
|
|
107
111
|
|
108
112
|
cast_big_decimal(source)
|
109
113
|
|
110
|
-
# p search_data
|
111
|
-
|
112
114
|
source.as_json
|
113
115
|
end
|
114
116
|
|
data/lib/searchkick/query.rb
CHANGED
@@ -38,7 +38,8 @@ module Searchkick
|
|
38
38
|
# pagination
|
39
39
|
page = [options[:page].to_i, 1].max
|
40
40
|
per_page = (options[:limit] || options[:per_page] || 100000).to_i
|
41
|
-
|
41
|
+
padding = [options[:padding].to_i, 0].max
|
42
|
+
offset = options[:offset] || (page - 1) * per_page + padding
|
42
43
|
|
43
44
|
conversions_field = searchkick_options[:conversions]
|
44
45
|
personalize_field = searchkick_options[:personalize]
|
@@ -218,6 +219,7 @@ module Searchkick
|
|
218
219
|
facets.each do |field, facet_options|
|
219
220
|
# ask for extra facets due to
|
220
221
|
# https://github.com/elasticsearch/elasticsearch/issues/1305
|
222
|
+
size = facet_options[:limit] ? facet_options[:limit] + 150 : 100000
|
221
223
|
|
222
224
|
if facet_options[:ranges]
|
223
225
|
payload[:facets][field] = {
|
@@ -225,11 +227,19 @@ module Searchkick
|
|
225
227
|
field.to_sym => facet_options[:ranges]
|
226
228
|
}
|
227
229
|
}
|
230
|
+
elsif facet_options[:stats]
|
231
|
+
payload[:facets][field] = {
|
232
|
+
terms_stats: {
|
233
|
+
key_field: field,
|
234
|
+
value_script: "doc.score",
|
235
|
+
size: size
|
236
|
+
}
|
237
|
+
}
|
228
238
|
else
|
229
239
|
payload[:facets][field] = {
|
230
240
|
terms: {
|
231
241
|
field: field,
|
232
|
-
size:
|
242
|
+
size: size
|
233
243
|
}
|
234
244
|
}
|
235
245
|
end
|
@@ -298,6 +308,7 @@ module Searchkick
|
|
298
308
|
@facet_limits = facet_limits
|
299
309
|
@page = page
|
300
310
|
@per_page = per_page
|
311
|
+
@padding = padding
|
301
312
|
@load = load
|
302
313
|
end
|
303
314
|
|
@@ -360,6 +371,7 @@ module Searchkick
|
|
360
371
|
opts = {
|
361
372
|
page: @page,
|
362
373
|
per_page: @per_page,
|
374
|
+
padding: @padding,
|
363
375
|
load: @load,
|
364
376
|
includes: options[:include] || options[:includes]
|
365
377
|
}
|
data/lib/searchkick/results.rb
CHANGED
@@ -39,7 +39,7 @@ module Searchkick
|
|
39
39
|
else
|
40
40
|
hits.map do |hit|
|
41
41
|
result = hit.except("_source").merge(hit["_source"])
|
42
|
-
result["id"]
|
42
|
+
result["id"] ||= result["_id"] # needed for legacy reasons
|
43
43
|
Hashie::Mash.new(result)
|
44
44
|
end
|
45
45
|
end
|
@@ -90,13 +90,17 @@ module Searchkick
|
|
90
90
|
end
|
91
91
|
alias_method :limit_value, :per_page
|
92
92
|
|
93
|
+
def padding
|
94
|
+
options[:padding]
|
95
|
+
end
|
96
|
+
|
93
97
|
def total_pages
|
94
98
|
(total_count / per_page.to_f).ceil
|
95
99
|
end
|
96
100
|
alias_method :num_pages, :total_pages
|
97
101
|
|
98
102
|
def offset_value
|
99
|
-
(current_page - 1) * per_page
|
103
|
+
(current_page - 1) * per_page + padding
|
100
104
|
end
|
101
105
|
alias_method :offset, :offset_value
|
102
106
|
|
data/lib/searchkick/version.rb
CHANGED
data/test/facets_test.rb
CHANGED
@@ -59,6 +59,13 @@ class TestFacets < Minitest::Unit::TestCase
|
|
59
59
|
assert_equal ({1 => 1, 2 => 1}), store_facet(where: {store_id: 2, price: {gt: 5}}, facets: [:store_id], smart_facets: true)
|
60
60
|
end
|
61
61
|
|
62
|
+
def test_stats_facets
|
63
|
+
options = {where: {store_id: 2}, facets: {store_id: {stats: true}}}
|
64
|
+
facets = Product.search("Product", options).facets["store_id"]["terms"]
|
65
|
+
expected_facets_keys = %w[term count total_count min max total mean]
|
66
|
+
assert_equal expected_facets_keys, facets.first.keys
|
67
|
+
end
|
68
|
+
|
62
69
|
protected
|
63
70
|
|
64
71
|
def store_facet(options)
|
data/test/sql_test.rb
CHANGED
@@ -19,19 +19,20 @@ class TestSql < Minitest::Unit::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_pagination
|
22
|
-
store_names ["Product A", "Product B", "Product C", "Product D", "Product E"]
|
23
|
-
products = Product.search("product", order: {name: :asc}, page: 2, per_page: 2)
|
24
|
-
assert_equal ["Product
|
22
|
+
store_names ["Product A", "Product B", "Product C", "Product D", "Product E", "Product F"]
|
23
|
+
products = Product.search("product", order: {name: :asc}, page: 2, per_page: 2, padding: 1)
|
24
|
+
assert_equal ["Product D", "Product E"], products.map(&:name)
|
25
25
|
assert_equal 2, products.current_page
|
26
|
+
assert_equal 1, products.padding
|
26
27
|
assert_equal 2, products.per_page
|
27
28
|
assert_equal 2, products.size
|
28
29
|
assert_equal 2, products.length
|
29
30
|
assert_equal 3, products.total_pages
|
30
|
-
assert_equal
|
31
|
-
assert_equal
|
31
|
+
assert_equal 6, products.total_count
|
32
|
+
assert_equal 6, products.total_entries
|
32
33
|
assert_equal 2, products.limit_value
|
33
|
-
assert_equal
|
34
|
-
assert_equal
|
34
|
+
assert_equal 3, products.offset_value
|
35
|
+
assert_equal 3, products.offset
|
35
36
|
assert !products.first_page?
|
36
37
|
assert !products.last_page?
|
37
38
|
assert !products.empty?
|
@@ -197,6 +198,10 @@ class TestSql < Minitest::Unit::TestCase
|
|
197
198
|
assert_order "product", ["Product A", "Product B", "Product C"], order: {color: :asc, store_id: :desc}
|
198
199
|
end
|
199
200
|
|
201
|
+
def test_order_ignore_unmapped
|
202
|
+
assert_order "product", [], order: {not_mapped: {ignore_unmapped: true}}, conversions: false
|
203
|
+
end
|
204
|
+
|
200
205
|
def test_partial
|
201
206
|
store_names ["Honey"]
|
202
207
|
assert_search "fresh honey", []
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: searchkick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|