searchkick 2.3.2 → 4.4.1

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.
Files changed (80) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +251 -84
  3. data/LICENSE.txt +1 -1
  4. data/README.md +552 -432
  5. data/lib/searchkick/bulk_indexer.rb +173 -0
  6. data/lib/searchkick/bulk_reindex_job.rb +2 -2
  7. data/lib/searchkick/hash_wrapper.rb +12 -0
  8. data/lib/searchkick/index.rb +187 -348
  9. data/lib/searchkick/index_options.rb +494 -282
  10. data/lib/searchkick/logging.rb +17 -13
  11. data/lib/searchkick/model.rb +52 -97
  12. data/lib/searchkick/multi_search.rb +9 -10
  13. data/lib/searchkick/process_batch_job.rb +17 -4
  14. data/lib/searchkick/process_queue_job.rb +20 -12
  15. data/lib/searchkick/query.rb +415 -199
  16. data/lib/searchkick/railtie.rb +7 -0
  17. data/lib/searchkick/record_data.rb +128 -0
  18. data/lib/searchkick/record_indexer.rb +79 -0
  19. data/lib/searchkick/reindex_queue.rb +1 -1
  20. data/lib/searchkick/reindex_v2_job.rb +14 -12
  21. data/lib/searchkick/results.rb +135 -41
  22. data/lib/searchkick/version.rb +1 -1
  23. data/lib/searchkick.rb +130 -61
  24. data/lib/tasks/searchkick.rake +34 -0
  25. metadata +18 -162
  26. data/.gitignore +0 -22
  27. data/.travis.yml +0 -39
  28. data/Gemfile +0 -16
  29. data/Rakefile +0 -20
  30. data/benchmark/Gemfile +0 -23
  31. data/benchmark/benchmark.rb +0 -97
  32. data/lib/searchkick/tasks.rb +0 -33
  33. data/searchkick.gemspec +0 -28
  34. data/test/aggs_test.rb +0 -197
  35. data/test/autocomplete_test.rb +0 -75
  36. data/test/boost_test.rb +0 -202
  37. data/test/callbacks_test.rb +0 -59
  38. data/test/ci/before_install.sh +0 -17
  39. data/test/errors_test.rb +0 -19
  40. data/test/gemfiles/activerecord31.gemfile +0 -7
  41. data/test/gemfiles/activerecord32.gemfile +0 -7
  42. data/test/gemfiles/activerecord40.gemfile +0 -8
  43. data/test/gemfiles/activerecord41.gemfile +0 -8
  44. data/test/gemfiles/activerecord42.gemfile +0 -7
  45. data/test/gemfiles/activerecord50.gemfile +0 -7
  46. data/test/gemfiles/apartment.gemfile +0 -8
  47. data/test/gemfiles/cequel.gemfile +0 -8
  48. data/test/gemfiles/mongoid2.gemfile +0 -7
  49. data/test/gemfiles/mongoid3.gemfile +0 -6
  50. data/test/gemfiles/mongoid4.gemfile +0 -7
  51. data/test/gemfiles/mongoid5.gemfile +0 -7
  52. data/test/gemfiles/mongoid6.gemfile +0 -12
  53. data/test/gemfiles/nobrainer.gemfile +0 -8
  54. data/test/gemfiles/parallel_tests.gemfile +0 -8
  55. data/test/geo_shape_test.rb +0 -175
  56. data/test/highlight_test.rb +0 -78
  57. data/test/index_test.rb +0 -166
  58. data/test/inheritance_test.rb +0 -83
  59. data/test/marshal_test.rb +0 -8
  60. data/test/match_test.rb +0 -276
  61. data/test/misspellings_test.rb +0 -56
  62. data/test/model_test.rb +0 -42
  63. data/test/multi_search_test.rb +0 -36
  64. data/test/multi_tenancy_test.rb +0 -22
  65. data/test/order_test.rb +0 -46
  66. data/test/pagination_test.rb +0 -70
  67. data/test/partial_reindex_test.rb +0 -58
  68. data/test/query_test.rb +0 -35
  69. data/test/records_test.rb +0 -10
  70. data/test/reindex_test.rb +0 -64
  71. data/test/reindex_v2_job_test.rb +0 -32
  72. data/test/routing_test.rb +0 -23
  73. data/test/should_index_test.rb +0 -32
  74. data/test/similar_test.rb +0 -28
  75. data/test/sql_test.rb +0 -214
  76. data/test/suggest_test.rb +0 -95
  77. data/test/support/kaminari.yml +0 -21
  78. data/test/synonyms_test.rb +0 -67
  79. data/test/test_helper.rb +0 -567
  80. data/test/where_test.rb +0 -223
@@ -1,58 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class PartialReindexTest < Minitest::Test
4
- def test_class_method
5
- store [{name: "Hi", color: "Blue"}]
6
-
7
- # normal search
8
- assert_search "hi", ["Hi"], fields: [:name], load: false
9
- assert_search "blue", ["Hi"], fields: [:color], load: false
10
-
11
- # update
12
- product = Product.first
13
- product.name = "Bye"
14
- product.color = "Red"
15
- Searchkick.callbacks(false) do
16
- product.save!
17
- end
18
- Product.searchkick_index.refresh
19
-
20
- # index not updated
21
- assert_search "hi", ["Hi"], fields: [:name], load: false
22
- assert_search "blue", ["Hi"], fields: [:color], load: false
23
-
24
- # partial reindex
25
- Product.reindex(:search_name)
26
-
27
- # name updated, but not color
28
- assert_search "bye", ["Bye"], fields: [:name], load: false
29
- assert_search "blue", ["Bye"], fields: [:color], load: false
30
- end
31
-
32
- def test_instance_method
33
- store [{name: "Hi", color: "Blue"}]
34
-
35
- # normal search
36
- assert_search "hi", ["Hi"], fields: [:name], load: false
37
- assert_search "blue", ["Hi"], fields: [:color], load: false
38
-
39
- # update
40
- product = Product.first
41
- product.name = "Bye"
42
- product.color = "Red"
43
- Searchkick.callbacks(false) do
44
- product.save!
45
- end
46
- Product.searchkick_index.refresh
47
-
48
- # index not updated
49
- assert_search "hi", ["Hi"], fields: [:name], load: false
50
- assert_search "blue", ["Hi"], fields: [:color], load: false
51
-
52
- product.reindex(:search_name, refresh: true)
53
-
54
- # name updated, but not color
55
- assert_search "bye", ["Bye"], fields: [:name], load: false
56
- assert_search "blue", ["Bye"], fields: [:color], load: false
57
- end
58
- end
data/test/query_test.rb DELETED
@@ -1,35 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class QueryTest < Minitest::Test
4
- def test_basic
5
- store_names ["Milk", "Apple"]
6
- query = Product.search("milk", execute: false)
7
- # query.body = {query: {match_all: {}}}
8
- # query.body = {query: {match: {name: "Apple"}}}
9
- query.body[:query] = {match_all: {}}
10
- assert_equal ["Apple", "Milk"], query.map(&:name).sort
11
- assert_equal ["Apple", "Milk"], query.execute.map(&:name).sort
12
- end
13
-
14
- def test_with_effective_min_score
15
- store_names ["Milk", "Milk2"]
16
- assert_search "milk", ["Milk"], body_options: {min_score: 1}
17
- end
18
-
19
- def test_with_uneffective_min_score
20
- store_names ["Milk", "Milk2"]
21
- assert_search "milk", ["Milk", "Milk2"], body_options: {min_score: 0.0001}
22
- end
23
-
24
- def test_default_timeout
25
- assert_equal "6s", Product.search("*", execute: false).body[:timeout]
26
- end
27
-
28
- def test_timeout_override
29
- assert_equal "1s", Product.search("*", body_options: {timeout: "1s"}, execute: false).body[:timeout]
30
- end
31
-
32
- def test_request_params
33
- assert_equal "dfs_query_then_fetch", Product.search("*", request_params: {search_type: "dfs_query_then_fetch"}, execute: false).params[:search_type]
34
- end
35
- end
data/test/records_test.rb DELETED
@@ -1,10 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class RecordsTest < Minitest::Test
4
- def test_records
5
- skip if cequel?
6
-
7
- store_names ["Milk", "Apple"]
8
- assert_equal Product.search("milk").records.where(name: "Milk").count, 1
9
- end
10
- end
data/test/reindex_test.rb DELETED
@@ -1,64 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class ReindexTest < Minitest::Test
4
- def test_scoped
5
- skip if nobrainer? || cequel?
6
-
7
- store_names ["Product A"]
8
- Searchkick.callbacks(false) do
9
- store_names ["Product B", "Product C"]
10
- end
11
- Product.where(name: "Product B").reindex(refresh: true)
12
- assert_search "product", ["Product A", "Product B"]
13
- end
14
-
15
- def test_associations
16
- skip if nobrainer? || cequel?
17
-
18
- store_names ["Product A"]
19
- store = Store.create!(name: "Test")
20
- Product.create!(name: "Product B", store_id: store.id)
21
- store.products.reindex(refresh: true)
22
- assert_search "product", ["Product A", "Product B"]
23
- end
24
-
25
- def test_async
26
- skip if !defined?(ActiveJob)
27
-
28
- Searchkick.callbacks(false) do
29
- store_names ["Product A"]
30
- end
31
- reindex = Product.reindex(async: true)
32
- assert_search "product", [], conversions: false
33
-
34
- index = Searchkick::Index.new(reindex[:index_name])
35
- index.refresh
36
- assert_equal 1, index.total_docs
37
-
38
- Product.searchkick_index.promote(reindex[:index_name])
39
- assert_search "product", ["Product A"]
40
- end
41
-
42
- def test_async_non_integer_pk
43
- skip if !defined?(ActiveJob)
44
-
45
- Sku.create(id: SecureRandom.hex, name: "Test")
46
- reindex = Sku.reindex(async: true)
47
- assert_search "sku", [], conversions: false
48
-
49
- index = Searchkick::Index.new(reindex[:index_name])
50
- index.refresh
51
- assert_equal 1, index.total_docs
52
- end
53
-
54
- def test_refresh_interval
55
- reindex = Product.reindex(refresh_interval: "30s", async: true, import: false)
56
- index = Searchkick::Index.new(reindex[:index_name])
57
- assert_nil Product.search_index.refresh_interval
58
- assert_equal "30s", index.refresh_interval
59
-
60
- Product.search_index.promote(index.name, update_refresh_interval: true)
61
- assert_equal "1s", index.refresh_interval
62
- assert_equal "1s", Product.search_index.refresh_interval
63
- end
64
- end
@@ -1,32 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class ReindexV2JobTest < Minitest::Test
4
- def setup
5
- skip unless defined?(ActiveJob)
6
- super
7
- Searchkick.disable_callbacks
8
- end
9
-
10
- def teardown
11
- Searchkick.enable_callbacks
12
- end
13
-
14
- def test_create
15
- product = Product.create!(name: "Boom")
16
- Product.searchkick_index.refresh
17
- assert_search "*", []
18
- Searchkick::ReindexV2Job.perform_later("Product", product.id.to_s)
19
- Product.searchkick_index.refresh
20
- assert_search "*", ["Boom"]
21
- end
22
-
23
- def test_destroy
24
- product = Product.create!(name: "Boom")
25
- Product.reindex
26
- assert_search "*", ["Boom"]
27
- product.destroy
28
- Searchkick::ReindexV2Job.perform_later("Product", product.id.to_s)
29
- Product.searchkick_index.refresh
30
- assert_search "*", []
31
- end
32
- end
data/test/routing_test.rb DELETED
@@ -1,23 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class RoutingTest < Minitest::Test
4
- def test_routing_query
5
- query = Store.search("Dollar Tree", routing: "Dollar Tree", execute: false)
6
- assert_equal query.params[:routing], "Dollar Tree"
7
- end
8
-
9
- def test_routing_mappings
10
- index_options = Store.searchkick_index.index_options
11
- assert_equal index_options[:mappings][:_default_][:_routing], required: true
12
- end
13
-
14
- def test_routing_correct_node
15
- store_names ["Dollar Tree"], Store
16
- assert_search "*", ["Dollar Tree"], {routing: "Dollar Tree"}, Store
17
- end
18
-
19
- def test_routing_incorrect_node
20
- store_names ["Dollar Tree"], Store
21
- assert_search "*", ["Dollar Tree"], {routing: "Boom"}, Store
22
- end
23
- end
@@ -1,32 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class ShouldIndexTest < Minitest::Test
4
- def test_basic
5
- store_names ["INDEX", "DO NOT INDEX"]
6
- assert_search "index", ["INDEX"]
7
- end
8
-
9
- def test_default_true
10
- assert Animal.new.should_index?
11
- end
12
-
13
- def test_change_to_true
14
- store_names ["DO NOT INDEX"]
15
- assert_search "index", []
16
- product = Product.first
17
- product.name = "INDEX"
18
- product.save!
19
- Product.searchkick_index.refresh
20
- assert_search "index", ["INDEX"]
21
- end
22
-
23
- def test_change_to_false
24
- store_names ["INDEX"]
25
- assert_search "index", ["INDEX"]
26
- product = Product.first
27
- product.name = "DO NOT INDEX"
28
- product.save!
29
- Product.searchkick_index.refresh
30
- assert_search "index", []
31
- end
32
- end
data/test/similar_test.rb DELETED
@@ -1,28 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class SimilarTest < Minitest::Test
4
- def test_similar
5
- store_names ["Annie's Naturals Organic Shiitake & Sesame Dressing"]
6
- assert_search "Annie's Naturals Shiitake & Sesame Vinaigrette", ["Annie's Naturals Organic Shiitake & Sesame Dressing"], similar: true
7
- end
8
-
9
- def test_fields
10
- store_names ["1% Organic Milk", "2% Organic Milk", "Popcorn"]
11
- assert_equal ["2% Organic Milk"], Product.where(name: "1% Organic Milk").first.similar(fields: ["name"]).map(&:name)
12
- end
13
-
14
- def test_order
15
- store_names ["Lucerne Milk Chocolate Fat Free", "Clover Fat Free Milk"]
16
- assert_order "Lucerne Fat Free Chocolate Milk", ["Lucerne Milk Chocolate Fat Free", "Clover Fat Free Milk"], similar: true
17
- end
18
-
19
- def test_limit
20
- store_names ["1% Organic Milk", "2% Organic Milk", "Fat Free Organic Milk", "Popcorn"]
21
- assert_equal ["2% Organic Milk"], Product.where(name: "1% Organic Milk").first.similar(fields: ["name"], order: ["name"], limit: 1).map(&:name)
22
- end
23
-
24
- def test_per_page
25
- store_names ["1% Organic Milk", "2% Organic Milk", "Fat Free Organic Milk", "Popcorn"]
26
- assert_equal ["2% Organic Milk"], Product.where(name: "1% Organic Milk").first.similar(fields: ["name"], order: ["name"], per_page: 1).map(&:name)
27
- end
28
- end
data/test/sql_test.rb DELETED
@@ -1,214 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class SqlTest < Minitest::Test
4
- def test_operator
5
- store_names ["Honey"]
6
- assert_search "fresh honey", []
7
- assert_search "fresh honey", ["Honey"], operator: "or"
8
- end
9
-
10
- def test_operator_scoring
11
- store_names ["Big Red Circle", "Big Green Circle", "Small Orange Circle"]
12
- assert_order "big red circle", ["Big Red Circle", "Big Green Circle", "Small Orange Circle"], operator: "or"
13
- end
14
-
15
- def test_fields_operator
16
- store [
17
- {name: "red", color: "red"},
18
- {name: "blue", color: "blue"},
19
- {name: "cyan", color: "blue green"},
20
- {name: "magenta", color: "red blue"},
21
- {name: "green", color: "green"}
22
- ]
23
- assert_search "red blue", ["red", "blue", "cyan", "magenta"], operator: "or", fields: ["color"]
24
- end
25
-
26
- def test_fields
27
- store [
28
- {name: "red", color: "light blue"},
29
- {name: "blue", color: "red fish"}
30
- ]
31
- assert_search "blue", ["red"], fields: ["color"]
32
- end
33
-
34
- def test_non_existent_field
35
- store_names ["Milk"]
36
- assert_search "milk", [], fields: ["not_here"]
37
- end
38
-
39
- def test_fields_both_match
40
- store [
41
- {name: "Blue A", color: "red"},
42
- {name: "Blue B", color: "light blue"}
43
- ]
44
- assert_first "blue", "Blue B", fields: [:name, :color]
45
- end
46
-
47
- def test_big_decimal
48
- store [
49
- {name: "Product", latitude: 80.0}
50
- ]
51
- assert_search "product", ["Product"], where: {latitude: {gt: 79}}
52
- end
53
-
54
- # body_options
55
-
56
- def test_body_options_should_merge_into_body
57
- query = Product.search("*", body_options: {min_score: 1.0}, execute: false)
58
- assert_equal 1.0, query.body[:min_score]
59
- end
60
-
61
- # load
62
-
63
- def test_load_default
64
- store_names ["Product A"]
65
- assert_kind_of Product, Product.search("product").first
66
- end
67
-
68
- def test_load_false
69
- store_names ["Product A"]
70
- assert_kind_of Hash, Product.search("product", load: false).first
71
- end
72
-
73
- def test_load_false_methods
74
- store_names ["Product A"]
75
- assert_equal "Product A", Product.search("product", load: false).first.name
76
- end
77
-
78
- def test_load_false_with_includes
79
- store_names ["Product A"]
80
- assert_kind_of Hash, Product.search("product", load: false, includes: [:store]).first
81
- end
82
-
83
- def test_load_false_nested_object
84
- aisle = {"id" => 1, "name" => "Frozen"}
85
- store [{name: "Product A", aisle: aisle}]
86
- assert_equal aisle, Product.search("product", load: false).first.aisle.to_hash
87
- end
88
-
89
- # select
90
-
91
- def test_select
92
- store [{name: "Product A", store_id: 1}]
93
- result = Product.search("product", load: false, select: [:name, :store_id]).first
94
- assert_equal %w(id name store_id), result.keys.reject { |k| k.start_with?("_") }.sort
95
- assert_equal "Product A", result.name
96
- assert_equal 1, result.store_id
97
- end
98
-
99
- def test_select_array
100
- store [{name: "Product A", user_ids: [1, 2]}]
101
- result = Product.search("product", load: false, select: [:user_ids]).first
102
- assert_equal [1, 2], result.user_ids
103
- end
104
-
105
- def test_select_single_field
106
- store [{name: "Product A", store_id: 1}]
107
- result = Product.search("product", load: false, select: :name).first
108
- assert_equal %w(id name), result.keys.reject { |k| k.start_with?("_") }.sort
109
- assert_equal "Product A", result.name
110
- assert_nil result.store_id
111
- end
112
-
113
- def test_select_all
114
- store [{name: "Product A", user_ids: [1, 2]}]
115
- hit = Product.search("product", select: true).hits.first
116
- assert_equal hit["_source"]["name"], "Product A"
117
- assert_equal hit["_source"]["user_ids"], [1, 2]
118
- end
119
-
120
- def test_select_none
121
- store [{name: "Product A", user_ids: [1, 2]}]
122
- hit = Product.search("product", select: []).hits.first
123
- assert_nil hit["_source"]
124
- hit = Product.search("product", select: false).hits.first
125
- assert_nil hit["_source"]
126
- end
127
-
128
- def test_select_include
129
- skip unless elasticsearch_below50?
130
- store [{name: "Product A", user_ids: [1, 2]}]
131
- result = Product.search("product", load: false, select: {include: [:name]}).first
132
- assert_equal %w(id name), result.keys.reject { |k| k.start_with?("_") }.sort
133
- assert_equal "Product A", result.name
134
- assert_nil result.store_id
135
- end
136
-
137
- def test_select_exclude
138
- skip unless elasticsearch_below50?
139
- store [{name: "Product A", user_ids: [1, 2], store_id: 1}]
140
- result = Product.search("product", load: false, select: {exclude: [:name]}).first
141
- assert_nil result.name
142
- assert_equal [1, 2], result.user_ids
143
- assert_equal 1, result.store_id
144
- end
145
-
146
- def test_select_include_and_exclude
147
- skip unless elasticsearch_below50?
148
- # let's take this to the next level
149
- store [{name: "Product A", user_ids: [1, 2], store_id: 1}]
150
- result = Product.search("product", load: false, select: {include: [:store_id], exclude: [:name]}).first
151
- assert_equal 1, result.store_id
152
- assert_nil result.name
153
- assert_nil result.user_ids
154
- end
155
-
156
- def test_select_includes
157
- skip if elasticsearch_below50?
158
- store [{name: "Product A", user_ids: [1, 2]}]
159
- result = Product.search("product", load: false, select: {includes: [:name]}).first
160
- assert_equal %w(id name), result.keys.reject { |k| k.start_with?("_") }.sort
161
- assert_equal "Product A", result.name
162
- assert_nil result.store_id
163
- end
164
-
165
- def test_select_excludes
166
- skip if elasticsearch_below50?
167
- store [{name: "Product A", user_ids: [1, 2], store_id: 1}]
168
- result = Product.search("product", load: false, select: {excludes: [:name]}).first
169
- assert_nil result.name
170
- assert_equal [1, 2], result.user_ids
171
- assert_equal 1, result.store_id
172
- end
173
-
174
- def test_select_include_and_excludes
175
- skip if elasticsearch_below50?
176
- # let's take this to the next level
177
- store [{name: "Product A", user_ids: [1, 2], store_id: 1}]
178
- result = Product.search("product", load: false, select: {includes: [:store_id], excludes: [:name]}).first
179
- assert_equal 1, result.store_id
180
- assert_nil result.name
181
- assert_nil result.user_ids
182
- end
183
-
184
- # nested
185
-
186
- def test_nested_search
187
- store [{name: "Product A", aisle: {"id" => 1, "name" => "Frozen"}}], Speaker
188
- assert_search "frozen", ["Product A"], {fields: ["aisle.name"]}, Speaker
189
- end
190
-
191
- # other tests
192
-
193
- def test_includes
194
- skip unless defined?(ActiveRecord)
195
- store_names ["Product A"]
196
- assert Product.search("product", includes: [:store]).first.association(:store).loaded?
197
- end
198
-
199
- def test_model_includes
200
- skip unless defined?(ActiveRecord)
201
-
202
- store_names ["Product A"]
203
- store_names ["Store A"], Store
204
-
205
- associations = {Product => [:store], Store => [:products]}
206
- result = Searchkick.search("*", index_name: [Product, Store], model_includes: associations)
207
-
208
- assert_equal 2, result.length
209
-
210
- result.group_by(&:class).each_pair do |klass, records|
211
- assert records.first.association(associations[klass].first).loaded?
212
- end
213
- end
214
- end
data/test/suggest_test.rb DELETED
@@ -1,95 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class SuggestTest < Minitest::Test
4
- def test_basic
5
- store_names ["Great White Shark", "Hammerhead Shark", "Tiger Shark"]
6
- assert_suggest "How Big is a Tigre Shar", "how big is a tiger shark", fields: [:name]
7
- end
8
-
9
- def test_perfect
10
- store_names ["Tiger Shark", "Great White Shark"]
11
- assert_suggest "Tiger Shark", nil, fields: [:name] # no correction
12
- end
13
-
14
- def test_phrase
15
- store_names ["Big Tiger Shark", "Tiger Sharp Teeth", "Tiger Sharp Mind"]
16
- assert_suggest "How to catch a big tiger shar", "how to catch a big tiger shark", fields: [:name]
17
- end
18
-
19
- def test_without_option
20
- store_names ["hi"] # needed to prevent ElasticsearchException - seed 668
21
- assert_raises(RuntimeError) { Product.search("hi").suggestions }
22
- end
23
-
24
- def test_multiple_fields
25
- store [
26
- {name: "Shark", color: "Sharp"},
27
- {name: "Shark", color: "Sharp"}
28
- ]
29
- assert_suggest_all "shar", ["shark", "sharp"]
30
- end
31
-
32
- def test_multiple_fields_highest_score_first
33
- store [
34
- {name: "Tiger Shark", color: "Sharp"}
35
- ]
36
- assert_suggest "tiger shar", "tiger shark"
37
- end
38
-
39
- def test_multiple_fields_same_value
40
- store [
41
- {name: "Shark", color: "Shark"}
42
- ]
43
- assert_suggest_all "shar", ["shark"]
44
- end
45
-
46
- def test_fields_option
47
- store [
48
- {name: "Shark", color: "Sharp"}
49
- ]
50
- assert_suggest_all "shar", ["shark"], fields: [:name]
51
- end
52
-
53
- def test_fields_option_multiple
54
- store [
55
- {name: "Shark"}
56
- ]
57
- assert_suggest "shar", "shark", fields: [:name, :unknown]
58
- end
59
-
60
- def test_fields_partial_match
61
- store_names ["Great White Shark", "Hammerhead Shark", "Tiger Shark"]
62
- assert_suggest "How Big is a Tigre Shar", "how big is a tiger shark", fields: [{name: :word_start}]
63
- end
64
-
65
- def test_fields_partial_match_boost
66
- store_names ["Great White Shark", "Hammerhead Shark", "Tiger Shark"]
67
- assert_suggest "How Big is a Tigre Shar", "how big is a tiger shark", fields: [{"name^2" => :word_start}]
68
- end
69
-
70
- def test_multiple_models
71
- store_names ["Great White Shark", "Hammerhead Shark", "Tiger Shark"]
72
- assert_equal "how big is a tiger shark", Searchkick.search("How Big is a Tigre Shar", suggest: [:name], fields: [:name]).suggestions.first
73
- end
74
-
75
- def test_multiple_models_no_fields
76
- store_names ["Great White Shark", "Hammerhead Shark", "Tiger Shark"]
77
- assert_raises(ArgumentError) { Searchkick.search("How Big is a Tigre Shar", suggest: true) }
78
- end
79
-
80
- protected
81
-
82
- def assert_suggest(term, expected, options = {})
83
- result = Product.search(term, options.merge(suggest: true)).suggestions.first
84
- if expected.nil?
85
- assert_nil result
86
- else
87
- assert_equal expected, result
88
- end
89
- end
90
-
91
- # any order
92
- def assert_suggest_all(term, expected, options = {})
93
- assert_equal expected.sort, Product.search(term, options.merge(suggest: true)).suggestions.sort
94
- end
95
- end
@@ -1,21 +0,0 @@
1
- en:
2
- views:
3
- pagination:
4
- first: "&laquo; First"
5
- last: "Last &raquo;"
6
- previous: "&lsaquo; Prev"
7
- next: "Next &rsaquo;"
8
- truncate: "&hellip;"
9
- helpers:
10
- page_entries_info:
11
- entry:
12
- zero: "entries"
13
- one: "entry"
14
- other: "entries"
15
- one_page:
16
- display_entries:
17
- zero: "No %{entry_name} found"
18
- one: "Displaying <b>1</b> %{entry_name}"
19
- other: "Displaying <b>all %{count}</b> %{entry_name}"
20
- more_pages:
21
- display_entries: "Displaying %{entry_name} <b>%{first}&nbsp;-&nbsp;%{last}</b> of <b>%{total}</b> in total"
@@ -1,67 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class SynonymsTest < Minitest::Test
4
- def test_bleach
5
- store_names ["Clorox Bleach", "Kroger Bleach"]
6
- assert_search "clorox", ["Clorox Bleach", "Kroger Bleach"]
7
- end
8
-
9
- def test_saran_wrap
10
- store_names ["Saran Wrap", "Kroger Plastic Wrap"]
11
- assert_search "saran wrap", ["Saran Wrap", "Kroger Plastic Wrap"]
12
- end
13
-
14
- def test_burger_buns
15
- store_names ["Hamburger Buns"]
16
- assert_search "burger buns", ["Hamburger Buns"]
17
- end
18
-
19
- def test_bandaids
20
- store_names ["Band-Aid", "Kroger 12-Pack Bandages"]
21
- assert_search "bandaids", ["Band-Aid", "Kroger 12-Pack Bandages"]
22
- end
23
-
24
- def test_qtips
25
- store_names ["Q Tips", "Kroger Cotton Swabs"]
26
- assert_search "q tips", ["Q Tips", "Kroger Cotton Swabs"]
27
- end
28
-
29
- def test_reverse
30
- store_names ["Scallions"]
31
- assert_search "green onions", ["Scallions"]
32
- end
33
-
34
- def test_exact
35
- store_names ["Green Onions", "Yellow Onions"]
36
- assert_search "scallion", ["Green Onions"]
37
- end
38
-
39
- def test_stemmed
40
- store_names ["Green Onions", "Yellow Onions"]
41
- assert_search "scallions", ["Green Onions"]
42
- end
43
-
44
- def test_word_start
45
- store_names ["Clorox Bleach", "Kroger Bleach"]
46
- assert_search "clorox", ["Clorox Bleach", "Kroger Bleach"], fields: [{name: :word_start}]
47
- end
48
-
49
- def test_wordnet
50
- skip unless ENV["TEST_WORDNET"]
51
- store_names ["Creature", "Beast", "Dragon"], Animal
52
- assert_search "animal", ["Creature", "Beast"], {}, Animal
53
- end
54
-
55
- def test_directional
56
- store_names ["Lightbulb", "Green Onions", "Led"]
57
- assert_search "led", ["Lightbulb", "Led"]
58
- assert_search "Lightbulb", ["Lightbulb"]
59
- assert_search "Halogen Lamp", ["Lightbulb"]
60
- assert_search "onions", ["Green Onions"]
61
- end
62
-
63
- def test_case
64
- store_names ["Uppercase"]
65
- assert_search "lowercase", ["Uppercase"]
66
- end
67
- end