searchkick 4.3.0 → 4.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +49 -16
- data/lib/searchkick.rb +17 -1
- data/lib/searchkick/index.rb +6 -0
- data/lib/searchkick/index_options.rb +5 -8
- data/lib/searchkick/model.rb +6 -2
- data/lib/searchkick/query.rb +2 -1
- data/lib/searchkick/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01c6ee30f8005b48d1bff0515d2c3ad4a01b06aa75367be23ba3846905e2452c
|
4
|
+
data.tar.gz: 2cd8509ad85e598405f4262f6bcd74d2f14214078b01f927a1e835c1bf2302f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00fbf37d1aefa95abe59e749dd820992cc87f0ea12d751b37f80d1a734dc2cc7a0bcbc96bcf63f4a73bc874a9fff276c420f02fd6fe901143834f904cf243fc0
|
7
|
+
data.tar.gz: c0b686a80177fd9d743c1bcea45369d59742e8152890cf70d93c4d3b4a67a72653f07b2daf9e8a464ec4d879207c4dbcddd26cee69377508d14c7dbaeaad6a58
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -764,8 +764,6 @@ Order
|
|
764
764
|
Product.search "wingtips", aggs: {color: {order: {"_key" => "asc"}}} # alphabetically
|
765
765
|
```
|
766
766
|
|
767
|
-
**Note:** Use `_term` instead of `_key` in Elasticsearch 5
|
768
|
-
|
769
767
|
[All of these options are supported](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#search-aggregations-bucket-terms-aggregation-order)
|
770
768
|
|
771
769
|
Ranges
|
@@ -1034,7 +1032,7 @@ Searchkick uses `ENV["ELASTICSEARCH_URL"]` for the Elasticsearch server. This de
|
|
1034
1032
|
|
1035
1033
|
### Heroku
|
1036
1034
|
|
1037
|
-
Choose an add-on: [Bonsai](https://elements.heroku.com/addons/bonsai)
|
1035
|
+
Choose an add-on: [Bonsai](https://elements.heroku.com/addons/bonsai), [SearchBox](https://elements.heroku.com/addons/searchbox), or [Elastic Cloud](https://elements.heroku.com/addons/foundelasticsearch).
|
1038
1036
|
|
1039
1037
|
For Bonsai:
|
1040
1038
|
|
@@ -1043,6 +1041,13 @@ heroku addons:create bonsai
|
|
1043
1041
|
heroku config:set ELASTICSEARCH_URL=`heroku config:get BONSAI_URL`
|
1044
1042
|
```
|
1045
1043
|
|
1044
|
+
For SearchBox:
|
1045
|
+
|
1046
|
+
```sh
|
1047
|
+
heroku addons:create searchbox:starter
|
1048
|
+
heroku config:set ELASTICSEARCH_URL=`heroku config:get SEARCHBOX_URL`
|
1049
|
+
```
|
1050
|
+
|
1046
1051
|
For Elastic Cloud (previously Found):
|
1047
1052
|
|
1048
1053
|
```sh
|
@@ -1807,6 +1812,44 @@ Product.search "ah", misspellings: {prefix_length: 2} # ah, no aha
|
|
1807
1812
|
|
1808
1813
|
For performance, only enable Searchkick callbacks for the tests that need it.
|
1809
1814
|
|
1815
|
+
### Parallel Tests
|
1816
|
+
|
1817
|
+
Rails 6 enables parallel tests by default. Add to your `test/test_helper.rb`:
|
1818
|
+
|
1819
|
+
```ruby
|
1820
|
+
class ActiveSupport::TestCase
|
1821
|
+
parallelize_setup do |worker|
|
1822
|
+
Searchkick.index_suffix = worker
|
1823
|
+
|
1824
|
+
# reindex models
|
1825
|
+
Product.reindex
|
1826
|
+
|
1827
|
+
# and disable callbacks
|
1828
|
+
Searchkick.disable_callbacks
|
1829
|
+
end
|
1830
|
+
end
|
1831
|
+
```
|
1832
|
+
|
1833
|
+
And use:
|
1834
|
+
|
1835
|
+
```ruby
|
1836
|
+
class ProductTest < ActiveSupport::TestCase
|
1837
|
+
def setup
|
1838
|
+
Searchkick.enable_callbacks
|
1839
|
+
end
|
1840
|
+
|
1841
|
+
def teardown
|
1842
|
+
Searchkick.disable_callbacks
|
1843
|
+
end
|
1844
|
+
|
1845
|
+
def test_search
|
1846
|
+
Product.create!(name: "Apple")
|
1847
|
+
Product.search_index.refresh
|
1848
|
+
assert_equal ["Apple"], Product.search("apple").map(&:name)
|
1849
|
+
end
|
1850
|
+
end
|
1851
|
+
```
|
1852
|
+
|
1810
1853
|
### Minitest
|
1811
1854
|
|
1812
1855
|
Add to your `test/test_helper.rb`:
|
@@ -1854,7 +1897,7 @@ RSpec.configure do |config|
|
|
1854
1897
|
end
|
1855
1898
|
|
1856
1899
|
config.around(:each, search: true) do |example|
|
1857
|
-
Searchkick.callbacks(
|
1900
|
+
Searchkick.callbacks(nil) do
|
1858
1901
|
example.run
|
1859
1902
|
end
|
1860
1903
|
end
|
@@ -1896,14 +1939,6 @@ end
|
|
1896
1939
|
FactoryBot.create(:product, :some_trait, :reindex, some_attribute: "foo")
|
1897
1940
|
```
|
1898
1941
|
|
1899
|
-
### Parallel Tests
|
1900
|
-
|
1901
|
-
Set:
|
1902
|
-
|
1903
|
-
```ruby
|
1904
|
-
Searchkick.index_suffix = ENV["TEST_ENV_NUMBER"]
|
1905
|
-
```
|
1906
|
-
|
1907
1942
|
## Multi-Tenancy
|
1908
1943
|
|
1909
1944
|
Check out [this great post](https://www.tiagoamaro.com.br/2014/12/11/multi-tenancy-with-searchkick/) on the [Apartment](https://github.com/influitive/apartment) gem. Follow a similar pattern if you use another gem.
|
@@ -1979,13 +2014,11 @@ Everyone is encouraged to help improve this project. Here are a few ways you can
|
|
1979
2014
|
- Write, clarify, or fix documentation
|
1980
2015
|
- Suggest or add new features
|
1981
2016
|
|
1982
|
-
|
1983
|
-
|
1984
|
-
To get started with development and testing:
|
2017
|
+
To get started with development:
|
1985
2018
|
|
1986
2019
|
```sh
|
1987
2020
|
git clone https://github.com/ankane/searchkick.git
|
1988
2021
|
cd searchkick
|
1989
2022
|
bundle install
|
1990
|
-
rake test
|
2023
|
+
bundle exec rake test
|
1991
2024
|
```
|
data/lib/searchkick.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
# dependencies
|
1
2
|
require "active_support"
|
2
3
|
require "active_support/core_ext/hash/deep_merge"
|
3
4
|
require "elasticsearch"
|
4
5
|
require "hashie"
|
5
6
|
|
7
|
+
# modules
|
6
8
|
require "searchkick/bulk_indexer"
|
7
9
|
require "searchkick/index"
|
8
10
|
require "searchkick/indexer"
|
@@ -17,6 +19,7 @@ require "searchkick/record_indexer"
|
|
17
19
|
require "searchkick/results"
|
18
20
|
require "searchkick/version"
|
19
21
|
|
22
|
+
# integrations
|
20
23
|
require "searchkick/railtie" if defined?(Rails)
|
21
24
|
require "searchkick/logging" if defined?(ActiveSupport::Notifications)
|
22
25
|
|
@@ -27,6 +30,7 @@ module Searchkick
|
|
27
30
|
autoload :ProcessQueueJob, "searchkick/process_queue_job"
|
28
31
|
autoload :ReindexV2Job, "searchkick/reindex_v2_job"
|
29
32
|
|
33
|
+
# errors
|
30
34
|
class Error < StandardError; end
|
31
35
|
class MissingIndexError < Error; end
|
32
36
|
class UnsupportedVersionError < Error; end
|
@@ -142,7 +146,7 @@ module Searchkick
|
|
142
146
|
end
|
143
147
|
end
|
144
148
|
|
145
|
-
def self.callbacks(value)
|
149
|
+
def self.callbacks(value = nil)
|
146
150
|
if block_given?
|
147
151
|
previous_value = callbacks_value
|
148
152
|
begin
|
@@ -249,6 +253,18 @@ module Searchkick
|
|
249
253
|
}
|
250
254
|
end
|
251
255
|
end
|
256
|
+
|
257
|
+
# private
|
258
|
+
# methods are forwarded to base class
|
259
|
+
# this check to see if scope exists on that class
|
260
|
+
# it's a bit tricky, but this seems to work
|
261
|
+
def self.relation?(klass)
|
262
|
+
if klass.respond_to?(:current_scope)
|
263
|
+
!klass.current_scope.nil?
|
264
|
+
elsif defined?(Mongoid::Threaded)
|
265
|
+
!Mongoid::Threaded.current_scope(klass).nil?
|
266
|
+
end
|
267
|
+
end
|
252
268
|
end
|
253
269
|
|
254
270
|
# TODO find better ActiveModel hook
|
data/lib/searchkick/index.rb
CHANGED
@@ -187,11 +187,17 @@ module Searchkick
|
|
187
187
|
options.delete(:refresh)
|
188
188
|
|
189
189
|
if method_name
|
190
|
+
# TODO throw ArgumentError
|
191
|
+
Searchkick.warn("unsupported keywords: #{options.keys.map(&:inspect).join(", ")}") if options.any?
|
192
|
+
|
190
193
|
# update
|
191
194
|
import_scope(relation, method_name: method_name, scope: scope)
|
192
195
|
self.refresh if refresh
|
193
196
|
true
|
194
197
|
elsif scoped && !full
|
198
|
+
# TODO throw ArgumentError
|
199
|
+
Searchkick.warn("unsupported keywords: #{options.keys.map(&:inspect).join(", ")}") if options.any?
|
200
|
+
|
195
201
|
# reindex association
|
196
202
|
import_scope(relation, scope: scope)
|
197
203
|
self.refresh if refresh
|
@@ -27,9 +27,6 @@ module Searchkick
|
|
27
27
|
default_analyzer = :searchkick_index
|
28
28
|
keyword_mapping = {type: "keyword"}
|
29
29
|
|
30
|
-
index_true_value = true
|
31
|
-
index_false_value = false
|
32
|
-
|
33
30
|
keyword_mapping[:ignore_above] = options[:ignore_above] || 30000
|
34
31
|
|
35
32
|
settings = {
|
@@ -356,13 +353,13 @@ module Searchkick
|
|
356
353
|
|
357
354
|
mapping_options[:searchable].delete("_all")
|
358
355
|
|
359
|
-
analyzed_field_options = {type: default_type, index:
|
356
|
+
analyzed_field_options = {type: default_type, index: true, analyzer: default_analyzer}
|
360
357
|
|
361
358
|
mapping_options.values.flatten.uniq.each do |field|
|
362
359
|
fields = {}
|
363
360
|
|
364
361
|
if options.key?(:filterable) && !mapping_options[:filterable].include?(field)
|
365
|
-
fields[field] = {type: default_type, index:
|
362
|
+
fields[field] = {type: default_type, index: false}
|
366
363
|
else
|
367
364
|
fields[field] = keyword_mapping
|
368
365
|
end
|
@@ -378,7 +375,7 @@ module Searchkick
|
|
378
375
|
|
379
376
|
mapping_options.except(:highlight, :searchable, :filterable, :word).each do |type, f|
|
380
377
|
if options[:match] == type || f.include?(field)
|
381
|
-
fields[type] = {type: default_type, index:
|
378
|
+
fields[type] = {type: default_type, index: true, analyzer: "searchkick_#{type}_index"}
|
382
379
|
end
|
383
380
|
end
|
384
381
|
end
|
@@ -418,12 +415,12 @@ module Searchkick
|
|
418
415
|
}
|
419
416
|
|
420
417
|
if options.key?(:filterable)
|
421
|
-
dynamic_fields["{name}"] = {type: default_type, index:
|
418
|
+
dynamic_fields["{name}"] = {type: default_type, index: false}
|
422
419
|
end
|
423
420
|
|
424
421
|
unless options[:searchable]
|
425
422
|
if options[:match] && options[:match] != :word
|
426
|
-
dynamic_fields[options[:match]] = {type: default_type, index:
|
423
|
+
dynamic_fields[options[:match]] = {type: default_type, index: true, analyzer: "searchkick_#{options[:match]}_index"}
|
427
424
|
end
|
428
425
|
|
429
426
|
if word
|
data/lib/searchkick/model.rb
CHANGED
@@ -41,6 +41,9 @@ module Searchkick
|
|
41
41
|
|
42
42
|
class << self
|
43
43
|
def searchkick_search(term = "*", **options, &block)
|
44
|
+
# TODO throw error in next major version
|
45
|
+
Searchkick.warn("calling search on a relation is deprecated") if Searchkick.relation?(self)
|
46
|
+
|
44
47
|
Searchkick.search(term, model: self, **options, &block)
|
45
48
|
end
|
46
49
|
alias_method Searchkick.search_method_name, :searchkick_search if Searchkick.search_method_name
|
@@ -54,10 +57,11 @@ module Searchkick
|
|
54
57
|
alias_method :search_index, :searchkick_index unless method_defined?(:search_index)
|
55
58
|
|
56
59
|
def searchkick_reindex(method_name = nil, **options)
|
57
|
-
|
60
|
+
# TODO relation = Searchkick.relation?(self)
|
61
|
+
relation = (respond_to?(:current_scope) && respond_to?(:default_scoped) && current_scope && current_scope.to_sql != default_scoped.to_sql) ||
|
58
62
|
(respond_to?(:queryable) && queryable != unscoped.with_default_scope)
|
59
63
|
|
60
|
-
searchkick_index.reindex(searchkick_klass, method_name, scoped:
|
64
|
+
searchkick_index.reindex(searchkick_klass, method_name, scoped: relation, **options)
|
61
65
|
end
|
62
66
|
alias_method :reindex, :searchkick_reindex unless method_defined?(:reindex)
|
63
67
|
|
data/lib/searchkick/query.rb
CHANGED
@@ -574,7 +574,8 @@ module Searchkick
|
|
574
574
|
|
575
575
|
def build_query(query, filters, should, must_not, custom_filters, multiply_filters)
|
576
576
|
if filters.any? || must_not.any? || should.any?
|
577
|
-
bool = {
|
577
|
+
bool = {}
|
578
|
+
bool[:must] = query if query
|
578
579
|
bool[:filter] = filters if filters.any? # where
|
579
580
|
bool[:must_not] = must_not if must_not.any? # exclude
|
580
581
|
bool[:should] = should if should.any? # conversions
|
data/lib/searchkick/version.rb
CHANGED
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: 4.3.
|
4
|
+
version: 4.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|