searchkick 0.7.5 → 0.7.6
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 +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
|