searchkick 1.2.1 → 1.3.0
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/.gitignore +2 -0
- data/.travis.yml +17 -5
- data/CHANGELOG.md +6 -0
- data/LICENSE.txt +1 -1
- data/README.md +26 -12
- data/lib/searchkick.rb +4 -0
- data/lib/searchkick/index.rb +62 -29
- data/lib/searchkick/model.rb +3 -1
- data/lib/searchkick/query.rb +334 -258
- data/lib/searchkick/version.rb +1 -1
- data/test/aggs_test.rb +4 -0
- data/test/ci/before_install.sh +6 -2
- data/test/facets_test.rb +1 -1
- data/test/gemfiles/apartment.gemfile +8 -0
- data/test/match_test.rb +8 -0
- data/test/multi_tenancy_test.rb +22 -0
- data/test/order_test.rb +6 -0
- data/test/sql_test.rb +5 -0
- data/test/test_helper.rb +48 -3
- metadata +7 -3
data/lib/searchkick/version.rb
CHANGED
data/test/aggs_test.rb
CHANGED
@@ -30,6 +30,10 @@ class AggsTest < Minitest::Test
|
|
30
30
|
assert_equal ({1 => 1, 2 => 2}), store_agg({aggs: {store_id_new: {field: "store_id"}}}, "store_id_new")
|
31
31
|
end
|
32
32
|
|
33
|
+
def test_min_doc_count
|
34
|
+
assert_equal ({2 => 2}), store_agg(aggs: {store_id: {min_doc_count: 2}})
|
35
|
+
end
|
36
|
+
|
33
37
|
def test_no_aggs
|
34
38
|
assert_nil Product.search("*").aggs
|
35
39
|
end
|
data/test/ci/before_install.sh
CHANGED
@@ -3,8 +3,12 @@
|
|
3
3
|
gem install bundler
|
4
4
|
|
5
5
|
sudo apt-get purge elasticsearch
|
6
|
-
|
7
|
-
|
6
|
+
if [[ $ELASTICSEARCH_VERSION == 1* ]]; then
|
7
|
+
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-$ELASTICSEARCH_VERSION.deb
|
8
|
+
else
|
9
|
+
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/$ELASTICSEARCH_VERSION/elasticsearch-$ELASTICSEARCH_VERSION.deb
|
10
|
+
fi
|
11
|
+
sudo dpkg -i elasticsearch-$ELASTICSEARCH_VERSION.deb
|
8
12
|
sudo service elasticsearch start
|
9
13
|
|
10
14
|
if [ -n "$NOBRAINER" ]; then
|
data/test/facets_test.rb
CHANGED
@@ -2,7 +2,7 @@ require_relative "test_helper"
|
|
2
2
|
|
3
3
|
class FacetsTest < Minitest::Test
|
4
4
|
def setup
|
5
|
-
skip
|
5
|
+
skip unless elasticsearch_below20?
|
6
6
|
super
|
7
7
|
store [
|
8
8
|
{name: "Product Show", latitude: 37.7833, longitude: 12.4167, store_id: 1, in_stock: true, color: "blue", price: 21, created_at: 2.days.ago},
|
data/test/match_test.rb
CHANGED
@@ -110,12 +110,14 @@ class MatchTest < Minitest::Test
|
|
110
110
|
end
|
111
111
|
|
112
112
|
def test_misspelling_zucchini_transposition
|
113
|
+
skip if elasticsearch_below14?
|
113
114
|
store_names ["zucchini"]
|
114
115
|
assert_search "zuccihni", ["zucchini"]
|
115
116
|
assert_search "zuccihni", [], misspellings: {transpositions: false}
|
116
117
|
end
|
117
118
|
|
118
119
|
def test_misspelling_lasagna
|
120
|
+
skip if elasticsearch_below14?
|
119
121
|
store_names ["lasagna"]
|
120
122
|
assert_search "lasanga", ["lasagna"], misspellings: {transpositions: true}
|
121
123
|
assert_search "lasgana", ["lasagna"], misspellings: {transpositions: true}
|
@@ -124,6 +126,7 @@ class MatchTest < Minitest::Test
|
|
124
126
|
end
|
125
127
|
|
126
128
|
def test_misspelling_lasagna_pasta
|
129
|
+
skip if elasticsearch_below14?
|
127
130
|
store_names ["lasagna pasta"]
|
128
131
|
assert_search "lasanga", ["lasagna pasta"], misspellings: {transpositions: true}
|
129
132
|
assert_search "lasanga pasta", ["lasagna pasta"], misspellings: {transpositions: true}
|
@@ -191,6 +194,11 @@ class MatchTest < Minitest::Test
|
|
191
194
|
assert_search "ben & jerrys", ["Ben and Jerry's"]
|
192
195
|
end
|
193
196
|
|
197
|
+
def test_phrase
|
198
|
+
store_names ["Fresh Honey", "Honey Fresh"]
|
199
|
+
assert_search "fresh honey", ["Fresh Honey"], match: :phrase
|
200
|
+
end
|
201
|
+
|
194
202
|
def test_unsearchable
|
195
203
|
store [
|
196
204
|
{name: "Unsearchable", description: "Almond"}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class MultiTenancyTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
skip unless defined?(Apartment)
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_basic
|
9
|
+
Apartment::Tenant.switch!("tenant1")
|
10
|
+
store_names ["Product A"], Tenant
|
11
|
+
Apartment::Tenant.switch!("tenant2")
|
12
|
+
store_names ["Product B"], Tenant
|
13
|
+
Apartment::Tenant.switch!("tenant1")
|
14
|
+
assert_search "product", ["Product A"], {load: false}, Tenant
|
15
|
+
Apartment::Tenant.switch!("tenant2")
|
16
|
+
assert_search "product", ["Product B"], {load: false}, Tenant
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
Apartment::Tenant.reset if defined?(Apartment)
|
21
|
+
end
|
22
|
+
end
|
data/test/order_test.rb
CHANGED
@@ -28,9 +28,15 @@ class OrderTest < Minitest::Test
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_order_ignore_unmapped
|
31
|
+
skip unless elasticsearch_below50?
|
31
32
|
assert_order "product", [], order: {not_mapped: {ignore_unmapped: true}}
|
32
33
|
end
|
33
34
|
|
35
|
+
def test_order_unmapped_type
|
36
|
+
skip if elasticsearch_below50?
|
37
|
+
assert_order "product", [], order: {not_mapped: {unmapped_type: "long"}}
|
38
|
+
end
|
39
|
+
|
34
40
|
def test_order_array
|
35
41
|
store [{name: "San Francisco", latitude: 37.7833, longitude: -122.4167}]
|
36
42
|
assert_order "francisco", ["San Francisco"], order: [{_geo_distance: {location: "0,0"}}]
|
data/test/sql_test.rb
CHANGED
@@ -77,6 +77,7 @@ class SqlTest < Minitest::Test
|
|
77
77
|
# select
|
78
78
|
|
79
79
|
def test_select
|
80
|
+
skip unless elasticsearch_below50?
|
80
81
|
store [{name: "Product A", store_id: 1}]
|
81
82
|
result = Product.search("product", load: false, select: [:name, :store_id]).first
|
82
83
|
assert_equal %w(id name store_id), result.keys.reject { |k| k.start_with?("_") }.sort
|
@@ -85,12 +86,14 @@ class SqlTest < Minitest::Test
|
|
85
86
|
end
|
86
87
|
|
87
88
|
def test_select_array
|
89
|
+
skip unless elasticsearch_below50?
|
88
90
|
store [{name: "Product A", user_ids: [1, 2]}]
|
89
91
|
result = Product.search("product", load: false, select: [:user_ids]).first
|
90
92
|
assert_equal [1, 2], result.user_ids
|
91
93
|
end
|
92
94
|
|
93
95
|
def test_select_single_field
|
96
|
+
skip unless elasticsearch_below50?
|
94
97
|
store [{name: "Product A", store_id: 1}]
|
95
98
|
result = Product.search("product", load: false, select: :name).first
|
96
99
|
assert_equal %w(id name), result.keys.reject { |k| k.start_with?("_") }.sort
|
@@ -99,6 +102,7 @@ class SqlTest < Minitest::Test
|
|
99
102
|
end
|
100
103
|
|
101
104
|
def test_select_all
|
105
|
+
skip unless elasticsearch_below50?
|
102
106
|
store [{name: "Product A", user_ids: [1, 2]}]
|
103
107
|
hit = Product.search("product", select: true).hits.first
|
104
108
|
assert_equal hit["_source"]["name"], "Product A"
|
@@ -106,6 +110,7 @@ class SqlTest < Minitest::Test
|
|
106
110
|
end
|
107
111
|
|
108
112
|
def test_select_none
|
113
|
+
skip unless elasticsearch_below50?
|
109
114
|
store [{name: "Product A", user_ids: [1, 2]}]
|
110
115
|
hit = Product.search("product", select: []).hits.first
|
111
116
|
assert_nil hit["_source"]
|
data/test/test_helper.rb
CHANGED
@@ -21,8 +21,16 @@ I18n.config.enforce_available_locales = true
|
|
21
21
|
ActiveJob::Base.logger = nil if defined?(ActiveJob)
|
22
22
|
ActiveSupport::LogSubscriber.logger = Logger.new(STDOUT) if ENV["NOTIFICATIONS"]
|
23
23
|
|
24
|
-
def
|
25
|
-
Searchkick.
|
24
|
+
def elasticsearch_below50?
|
25
|
+
Searchkick.server_below?("5.0.0-alpha1")
|
26
|
+
end
|
27
|
+
|
28
|
+
def elasticsearch_below20?
|
29
|
+
Searchkick.server_below?("2.0.0")
|
30
|
+
end
|
31
|
+
|
32
|
+
def elasticsearch_below14?
|
33
|
+
Searchkick.server_below?("1.4.0")
|
26
34
|
end
|
27
35
|
|
28
36
|
def mongoid2?
|
@@ -156,6 +164,43 @@ else
|
|
156
164
|
|
157
165
|
ActiveRecord::Base.raise_in_transactional_callbacks = true if ActiveRecord::Base.respond_to?(:raise_in_transactional_callbacks=)
|
158
166
|
|
167
|
+
if defined?(Apartment)
|
168
|
+
class Rails
|
169
|
+
def self.env
|
170
|
+
ENV["RACK_ENV"]
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
tenants = ["tenant1", "tenant2"]
|
175
|
+
Apartment.configure do |config|
|
176
|
+
config.tenant_names = tenants
|
177
|
+
config.database_schema_file = false
|
178
|
+
config.excluded_models = ["Product", "Store", "Animal", "Dog", "Cat"]
|
179
|
+
end
|
180
|
+
|
181
|
+
class Tenant < ActiveRecord::Base
|
182
|
+
searchkick index_prefix: -> { Apartment::Tenant.current }
|
183
|
+
end
|
184
|
+
|
185
|
+
tenants.each do |tenant|
|
186
|
+
begin
|
187
|
+
Apartment::Tenant.create(tenant)
|
188
|
+
rescue Apartment::TenantExists
|
189
|
+
# do nothing
|
190
|
+
end
|
191
|
+
Apartment::Tenant.switch!(tenant)
|
192
|
+
|
193
|
+
ActiveRecord::Migration.create_table :tenants, force: true do |t|
|
194
|
+
t.string :name
|
195
|
+
t.timestamps null: true
|
196
|
+
end
|
197
|
+
|
198
|
+
Tenant.reindex
|
199
|
+
end
|
200
|
+
|
201
|
+
Apartment::Tenant.reset
|
202
|
+
end
|
203
|
+
|
159
204
|
ActiveRecord::Migration.create_table :products do |t|
|
160
205
|
t.string :name
|
161
206
|
t.integer :store_id
|
@@ -251,7 +296,7 @@ class Store
|
|
251
296
|
mappings: {
|
252
297
|
store: {
|
253
298
|
properties: {
|
254
|
-
name: {type: "string", analyzer: "keyword"}
|
299
|
+
name: elasticsearch_below50? ? {type: "string", analyzer: "keyword"} : {type: "keyword"}
|
255
300
|
}
|
256
301
|
}
|
257
302
|
}
|
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.
|
4
|
+
version: 1.3.0
|
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-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- test/gemfiles/activerecord32.gemfile
|
132
132
|
- test/gemfiles/activerecord40.gemfile
|
133
133
|
- test/gemfiles/activerecord41.gemfile
|
134
|
+
- test/gemfiles/apartment.gemfile
|
134
135
|
- test/gemfiles/mongoid2.gemfile
|
135
136
|
- test/gemfiles/mongoid3.gemfile
|
136
137
|
- test/gemfiles/mongoid4.gemfile
|
@@ -143,6 +144,7 @@ files:
|
|
143
144
|
- test/misspellings_test.rb
|
144
145
|
- test/model_test.rb
|
145
146
|
- test/multi_search_test.rb
|
147
|
+
- test/multi_tenancy_test.rb
|
146
148
|
- test/order_test.rb
|
147
149
|
- test/pagination_test.rb
|
148
150
|
- test/query_test.rb
|
@@ -177,7 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
179
|
version: '0'
|
178
180
|
requirements: []
|
179
181
|
rubyforge_project:
|
180
|
-
rubygems_version: 2.
|
182
|
+
rubygems_version: 2.6.1
|
181
183
|
signing_key:
|
182
184
|
specification_version: 4
|
183
185
|
summary: Searchkick learns what your users are looking for. As more people search,
|
@@ -195,6 +197,7 @@ test_files:
|
|
195
197
|
- test/gemfiles/activerecord32.gemfile
|
196
198
|
- test/gemfiles/activerecord40.gemfile
|
197
199
|
- test/gemfiles/activerecord41.gemfile
|
200
|
+
- test/gemfiles/apartment.gemfile
|
198
201
|
- test/gemfiles/mongoid2.gemfile
|
199
202
|
- test/gemfiles/mongoid3.gemfile
|
200
203
|
- test/gemfiles/mongoid4.gemfile
|
@@ -207,6 +210,7 @@ test_files:
|
|
207
210
|
- test/misspellings_test.rb
|
208
211
|
- test/model_test.rb
|
209
212
|
- test/multi_search_test.rb
|
213
|
+
- test/multi_tenancy_test.rb
|
210
214
|
- test/order_test.rb
|
211
215
|
- test/pagination_test.rb
|
212
216
|
- test/query_test.rb
|