searchkick 1.3.4 → 1.3.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -3
- data/CHANGELOG.md +6 -0
- data/Gemfile +1 -0
- data/README.md +31 -11
- data/lib/searchkick.rb +14 -11
- data/lib/searchkick/index.rb +10 -357
- data/lib/searchkick/index_options.rb +359 -0
- data/lib/searchkick/query.rb +44 -29
- data/lib/searchkick/version.rb +1 -1
- data/test/aggs_test.rb +8 -10
- data/test/boost_test.rb +2 -2
- data/test/errors_test.rb +1 -1
- data/test/index_test.rb +9 -1
- data/test/query_test.rb +6 -1
- data/test/sql_test.rb +32 -1
- data/test/test_helper.rb +11 -9
- data/test/where_test.rb +7 -0
- metadata +4 -4
data/lib/searchkick/version.rb
CHANGED
data/test/aggs_test.rb
CHANGED
@@ -100,16 +100,14 @@ class AggsTest < Minitest::Test
|
|
100
100
|
store [{name: "Old Product", created_at: 3.years.ago}]
|
101
101
|
aggs = Product.search(
|
102
102
|
"Product",
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
}
|
112
|
-
}
|
103
|
+
aggs: {
|
104
|
+
products_per_year: {
|
105
|
+
date_histogram: {
|
106
|
+
field: :created_at,
|
107
|
+
interval: :year
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
113
111
|
).aggs
|
114
112
|
|
115
113
|
if elasticsearch_below20?
|
data/test/boost_test.rb
CHANGED
@@ -10,7 +10,7 @@ class BoostTest < Minitest::Test
|
|
10
10
|
{name: "Tomato C", conversions: {"tomato" => 3}}
|
11
11
|
]
|
12
12
|
assert_order "tomato", ["Tomato C", "Tomato B", "Tomato A"]
|
13
|
-
assert_equal_scores "tomato",
|
13
|
+
assert_equal_scores "tomato", conversions: false
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_multiple_conversions
|
@@ -19,7 +19,7 @@ class BoostTest < Minitest::Test
|
|
19
19
|
store [
|
20
20
|
{name: "Speaker A", conversions_a: {"speaker" => 1}, conversions_b: {"speaker" => 6}},
|
21
21
|
{name: "Speaker B", conversions_a: {"speaker" => 2}, conversions_b: {"speaker" => 5}},
|
22
|
-
{name: "Speaker C", conversions_a: {"speaker" => 3}, conversions_b: {"speaker" => 4}}
|
22
|
+
{name: "Speaker C", conversions_a: {"speaker" => 3}, conversions_b: {"speaker" => 4}}
|
23
23
|
], Speaker
|
24
24
|
|
25
25
|
assert_equal_scores "speaker", {conversions: false}, Speaker
|
data/test/errors_test.rb
CHANGED
data/test/index_test.rb
CHANGED
@@ -92,7 +92,7 @@ class IndexTest < Minitest::Test
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def test_unsupported_version
|
95
|
-
raises_exception = ->(_) { raise Elasticsearch::Transport::Transport::Error
|
95
|
+
raises_exception = ->(_) { raise Elasticsearch::Transport::Transport::Error, "[500] No query registered for [multi_match]" }
|
96
96
|
Searchkick.client.stub :search, raises_exception do
|
97
97
|
assert_raises(Searchkick::UnsupportedVersionError) { Product.search("test") }
|
98
98
|
end
|
@@ -112,6 +112,14 @@ class IndexTest < Minitest::Test
|
|
112
112
|
end
|
113
113
|
|
114
114
|
def test_analyzed_only
|
115
|
+
# skip for 5.0 since it throws
|
116
|
+
# Cannot search on field [alt_description] since it is not indexed.
|
117
|
+
skip unless elasticsearch_below50?
|
118
|
+
store [{name: "Product A", alt_description: "Hello"}]
|
119
|
+
assert_search "*", [], where: {alt_description: "Hello"}
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_analyzed_only_large_value
|
115
123
|
skip if nobrainer?
|
116
124
|
large_value = 10000.times.map { "hello" }.join(" ")
|
117
125
|
store [{name: "Product A", alt_description: large_value}]
|
data/test/query_test.rb
CHANGED
@@ -12,8 +12,9 @@ class QueryTest < Minitest::Test
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_with_effective_min_score
|
15
|
+
min_score = elasticsearch_below50? ? 0.1 : 1
|
15
16
|
store_names ["Milk", "Milk2"]
|
16
|
-
assert_search "milk", ["Milk"], body_options: {min_score:
|
17
|
+
assert_search "milk", ["Milk"], body_options: {min_score: min_score}
|
17
18
|
end
|
18
19
|
|
19
20
|
def test_with_uneffective_min_score
|
@@ -28,4 +29,8 @@ class QueryTest < Minitest::Test
|
|
28
29
|
def test_timeout_override
|
29
30
|
assert_equal "1s", Product.search("*", body_options: {timeout: "1s"}, execute: false).body[:timeout]
|
30
31
|
end
|
32
|
+
|
33
|
+
def test_request_params
|
34
|
+
assert_equal "dfs_query_then_fetch", Product.search("*", request_params: {search_type: "dfs_query_then_fetch"}, execute: false).params[:search_type]
|
35
|
+
end
|
31
36
|
end
|
data/test/sql_test.rb
CHANGED
@@ -55,7 +55,7 @@ class SqlTest < Minitest::Test
|
|
55
55
|
# body_options
|
56
56
|
|
57
57
|
def test_body_options_should_merge_into_body
|
58
|
-
query = Product.search({
|
58
|
+
query = Product.search({query: {name: "milk"}, body_options: {min_score: 1.0}}, execute: false)
|
59
59
|
assert_equal 1.0, query.body[:min_score]
|
60
60
|
end
|
61
61
|
|
@@ -163,6 +163,7 @@ class SqlTest < Minitest::Test
|
|
163
163
|
end
|
164
164
|
|
165
165
|
def test_select_v2_include
|
166
|
+
skip unless elasticsearch_below50?
|
166
167
|
store [{name: "Product A", user_ids: [1, 2]}]
|
167
168
|
result = Product.search("product", load: false, select_v2: {include: [:name]}).first
|
168
169
|
assert_equal %w(id name), result.keys.reject { |k| k.start_with?("_") }.sort
|
@@ -171,6 +172,7 @@ class SqlTest < Minitest::Test
|
|
171
172
|
end
|
172
173
|
|
173
174
|
def test_select_v2_exclude
|
175
|
+
skip unless elasticsearch_below50?
|
174
176
|
store [{name: "Product A", user_ids: [1, 2], store_id: 1}]
|
175
177
|
result = Product.search("product", load: false, select_v2: {exclude: [:name]}).first
|
176
178
|
assert_nil result.name
|
@@ -179,6 +181,7 @@ class SqlTest < Minitest::Test
|
|
179
181
|
end
|
180
182
|
|
181
183
|
def test_select_v2_include_and_exclude
|
184
|
+
skip unless elasticsearch_below50?
|
182
185
|
# let's take this to the next level
|
183
186
|
store [{name: "Product A", user_ids: [1, 2], store_id: 1}]
|
184
187
|
result = Product.search("product", load: false, select_v2: {include: [:store_id], exclude: [:name]}).first
|
@@ -187,6 +190,34 @@ class SqlTest < Minitest::Test
|
|
187
190
|
assert_nil result.user_ids
|
188
191
|
end
|
189
192
|
|
193
|
+
def test_select_v2_includes
|
194
|
+
skip if elasticsearch_below50?
|
195
|
+
store [{name: "Product A", user_ids: [1, 2]}]
|
196
|
+
result = Product.search("product", load: false, select_v2: {includes: [:name]}).first
|
197
|
+
assert_equal %w(id name), result.keys.reject { |k| k.start_with?("_") }.sort
|
198
|
+
assert_equal "Product A", result.name
|
199
|
+
assert_nil result.store_id
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_select_v2_excludes
|
203
|
+
skip if elasticsearch_below50?
|
204
|
+
store [{name: "Product A", user_ids: [1, 2], store_id: 1}]
|
205
|
+
result = Product.search("product", load: false, select_v2: {excludes: [:name]}).first
|
206
|
+
assert_nil result.name
|
207
|
+
assert_equal [1, 2], result.user_ids
|
208
|
+
assert_equal 1, result.store_id
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_select_v2_include_and_excludes
|
212
|
+
skip if elasticsearch_below50?
|
213
|
+
# let's take this to the next level
|
214
|
+
store [{name: "Product A", user_ids: [1, 2], store_id: 1}]
|
215
|
+
result = Product.search("product", load: false, select_v2: {includes: [:store_id], excludes: [:name]}).first
|
216
|
+
assert_equal 1, result.store_id
|
217
|
+
assert_nil result.name
|
218
|
+
assert_nil result.user_ids
|
219
|
+
end
|
220
|
+
|
190
221
|
# other tests
|
191
222
|
|
192
223
|
def test_nested_object
|
data/test/test_helper.rb
CHANGED
@@ -277,9 +277,9 @@ class Product
|
|
277
277
|
],
|
278
278
|
autocomplete: [:name],
|
279
279
|
suggest: [:name, :color],
|
280
|
-
conversions:
|
281
|
-
personalize:
|
282
|
-
locations: [
|
280
|
+
conversions: [:conversions],
|
281
|
+
personalize: :user_ids,
|
282
|
+
locations: [:location, :multiple_locations],
|
283
283
|
text_start: [:name],
|
284
284
|
text_middle: [:name],
|
285
285
|
text_end: [:name],
|
@@ -287,12 +287,13 @@ class Product
|
|
287
287
|
word_middle: [:name],
|
288
288
|
word_end: [:name],
|
289
289
|
highlight: [:name],
|
290
|
-
# unsearchable: [:description],
|
291
290
|
searchable: [:name, :color],
|
292
|
-
|
291
|
+
filterable: [:name, :color, :description],
|
292
|
+
# unsearchable: [:description],
|
293
|
+
# only_analyzed: [:alt_description],
|
293
294
|
match: ENV["MATCH"] ? ENV["MATCH"].to_sym : nil
|
294
295
|
|
295
|
-
attr_accessor :conversions, :user_ids, :aisle
|
296
|
+
attr_accessor :conversions, :user_ids, :aisle, :details
|
296
297
|
|
297
298
|
def search_data
|
298
299
|
serializable_hash.except("id").merge(
|
@@ -300,7 +301,8 @@ class Product
|
|
300
301
|
user_ids: user_ids,
|
301
302
|
location: {lat: latitude, lon: longitude},
|
302
303
|
multiple_locations: [{lat: latitude, lon: longitude}, {lat: 0, lon: 0}],
|
303
|
-
aisle: aisle
|
304
|
+
aisle: aisle,
|
305
|
+
details: details
|
304
306
|
)
|
305
307
|
end
|
306
308
|
|
@@ -339,7 +341,7 @@ class Speaker
|
|
339
341
|
def search_data
|
340
342
|
serializable_hash.except("id").merge(
|
341
343
|
conversions_a: conversions_a,
|
342
|
-
conversions_b: conversions_b
|
344
|
+
conversions_b: conversions_b
|
343
345
|
)
|
344
346
|
end
|
345
347
|
end
|
@@ -392,7 +394,7 @@ class Minitest::Test
|
|
392
394
|
end
|
393
395
|
|
394
396
|
def assert_equal_scores(term, options = {}, klass = Product)
|
395
|
-
assert_equal 1, klass.search(term, options).hits.map { |a| a[
|
397
|
+
assert_equal 1, klass.search(term, options).hits.map { |a| a["_score"] }.uniq.size
|
396
398
|
end
|
397
399
|
|
398
400
|
def assert_first(term, expected, options = {}, klass = Product)
|
data/test/where_test.rb
CHANGED
@@ -168,4 +168,11 @@ class WhereTest < Minitest::Test
|
|
168
168
|
]
|
169
169
|
assert_search "san", ["San Francisco"], where: {multiple_locations: {near: {lat: 37.5, lon: -122.5}}}
|
170
170
|
end
|
171
|
+
|
172
|
+
def test_nested
|
173
|
+
store [
|
174
|
+
{name: "Product A", details: {year: 2016}}
|
175
|
+
]
|
176
|
+
assert_search "product", ["Product A"], where: {"details.year" => 2016}
|
177
|
+
end
|
171
178
|
end
|
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: 1.3.
|
4
|
+
version: 1.3.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -110,6 +110,7 @@ files:
|
|
110
110
|
- Rakefile
|
111
111
|
- lib/searchkick.rb
|
112
112
|
- lib/searchkick/index.rb
|
113
|
+
- lib/searchkick/index_options.rb
|
113
114
|
- lib/searchkick/logging.rb
|
114
115
|
- lib/searchkick/middleware.rb
|
115
116
|
- lib/searchkick/model.rb
|
@@ -181,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
182
|
version: '0'
|
182
183
|
requirements: []
|
183
184
|
rubyforge_project:
|
184
|
-
rubygems_version: 2.
|
185
|
+
rubygems_version: 2.5.1
|
185
186
|
signing_key:
|
186
187
|
specification_version: 4
|
187
188
|
summary: Searchkick learns what your users are looking for. As more people search,
|
@@ -229,4 +230,3 @@ test_files:
|
|
229
230
|
- test/synonyms_test.rb
|
230
231
|
- test/test_helper.rb
|
231
232
|
- test/where_test.rb
|
232
|
-
has_rdoc:
|