searchkick 4.6.1 → 4.6.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1d925c63766341731235f39ccc55ff9c897927692bd36e0cfd6038a1d371d29
4
- data.tar.gz: c3b2f3597751a87b1498919c210fb25f5f14a0514632a5e4e351d54bc799cb63
3
+ metadata.gz: 6937cc5456846216a4ea52c2274dfc43220e7f848dde276f0102ce48de3184a6
4
+ data.tar.gz: 0bfcc6a4e5a893629f9cac734498efba357dbd19e6641c21af7ea8e82f94f1ba
5
5
  SHA512:
6
- metadata.gz: e33b43ba33b0e832a7db8d65ffce7d83b5ca6e293b9d3049d1b8a4fee18c35a60a3353a8132e4baa5b77fca00b4d2eb383c5b4adfa8a089282befe19925aca82
7
- data.tar.gz: 2e16bd24df683e543d81b1f272d8f67d42ef273c42de9d21f4366e001f39133161d714007aa0306077747d925c03c008f74b2b5ae5f0b4fe586daeba1aa8df66
6
+ metadata.gz: 0e7e41267464a8d32641edf6a578a6c65a97170f40e2f129effc8ff1da4144c30f00b88e52ddf6c51ffba366ec3cdfb263890e1539165ad47581c1723bf6b992
7
+ data.tar.gz: 49511b973a2fb7dce8d7952c0e5ccd676db357d2d965f46321e1b56bd5213f9f0c44f461f0010344f585e799dcbb13d9c4482772e20ab996462be86430c040cf
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 4.6.3 (2021-11-19)
2
+
3
+ - Added support for reloadable synonyms for OpenSearch
4
+ - Added experimental support for `opensearch` gem
5
+ - Removed `elasticsearch-xpack` dependency for reloadable synonyms
6
+
7
+ ## 4.6.2 (2021-11-15)
8
+
9
+ - Added support for beginless ranges to `where` option
10
+ - Fixed `like` and `ilike` with `+` character
11
+ - Fixed warning about accessing system indices when no model or index specified
12
+
1
13
  ## 4.6.1 (2021-09-25)
2
14
 
3
15
  - Added `ilike` operator for Elasticsearch 7.10+
data/README.md CHANGED
@@ -375,9 +375,9 @@ search_synonyms: ["lightbulb => halogenlamp"]
375
375
 
376
376
  The above approach works well when your synonym list is static, but in practice, this is often not the case. When you analyze search conversions, you often want to add new synonyms without a full reindex.
377
377
 
378
- #### Elasticsearch 7.3+
378
+ #### Elasticsearch 7.3+ or OpenSearch
379
379
 
380
- For Elasticsearch 7.3+, we recommend placing synonyms in a file on the Elasticsearch server (in the `config` directory). This allows you to reload synonyms without reindexing.
380
+ For Elasticsearch 7.3+ or OpenSearch, we recommend placing synonyms in a file on the Elasticsearch or OpenSearch server (in the `config` directory). This allows you to reload synonyms without reindexing.
381
381
 
382
382
  ```txt
383
383
  pop, soda
@@ -387,22 +387,18 @@ burger, hamburger
387
387
  Then use:
388
388
 
389
389
  ```ruby
390
- search_synonyms: "synonyms.txt"
391
- ```
392
-
393
- Add [elasticsearch-xpack](https://github.com/elastic/elasticsearch-ruby/tree/master/elasticsearch-xpack) to your Gemfile:
394
-
395
- ```ruby
396
- gem 'elasticsearch-xpack', '>= 7.8', '< 7.14'
390
+ class Product < ApplicationRecord
391
+ searchkick search_synonyms: "synonyms.txt"
392
+ end
397
393
  ```
398
394
 
399
- And use:
395
+ And reload with:
400
396
 
401
397
  ```ruby
402
398
  Product.search_index.reload_synonyms
403
399
  ```
404
400
 
405
- #### Elasticsearch < 7.3 or OpenSearch
401
+ #### Elasticsearch < 7.3
406
402
 
407
403
  You can use a library like [ActsAsTaggableOn](https://github.com/mbleigh/acts-as-taggable-on) and do:
408
404
 
@@ -84,7 +84,8 @@ module Searchkick
84
84
  old_indices =
85
85
  begin
86
86
  client.indices.get_alias(name: name).keys
87
- rescue Elasticsearch::Transport::Transport::Errors::NotFound
87
+ rescue => e
88
+ raise e unless Searchkick.not_found_error?(e)
88
89
  {}
89
90
  end
90
91
  actions = old_indices.map { |old_name| {remove: {index: old_name, alias: name}} } + [{add: {index: new_name, alias: name}}]
@@ -109,7 +110,8 @@ module Searchkick
109
110
  else
110
111
  client.indices.get_aliases
111
112
  end
112
- rescue Elasticsearch::Transport::Transport::Errors::NotFound
113
+ rescue => e
114
+ raise e unless Searchkick.not_found_error?(e)
113
115
  {}
114
116
  end
115
117
  indices = indices.select { |_k, v| v.empty? || v["aliases"].empty? } if unaliased
@@ -178,13 +180,15 @@ module Searchkick
178
180
  end
179
181
 
180
182
  def reload_synonyms
181
- require "elasticsearch/xpack"
182
- raise Error, "Requires Elasticsearch 7.3+" if Searchkick.server_below?("7.3.0")
183
- raise Error, "Requires elasticsearch-xpack 7.8+" unless client.xpack.respond_to?(:indices)
184
- begin
185
- client.xpack.indices.reload_search_analyzers(index: name)
186
- rescue Elasticsearch::Transport::Transport::Errors::MethodNotAllowed
187
- raise Error, "Requires non-OSS version of Elasticsearch"
183
+ if Searchkick.opensearch?
184
+ client.transport.perform_request "POST", "_plugins/_refresh_search_analyzers/#{CGI.escape(name)}"
185
+ else
186
+ raise Error, "Requires Elasticsearch 7.3+" if Searchkick.server_below?("7.3.0")
187
+ begin
188
+ client.transport.perform_request("GET", "#{CGI.escape(name)}/_reload_search_analyzers")
189
+ rescue Elasticsearch::Transport::Transport::Errors::MethodNotAllowed
190
+ raise Error, "Requires non-OSS version of Elasticsearch"
191
+ end
188
192
  end
189
193
  end
190
194
 
@@ -361,8 +365,8 @@ module Searchkick
361
365
  index.refresh
362
366
  true
363
367
  end
364
- rescue Elasticsearch::Transport::Transport::Errors::BadRequest => e
365
- if e.message.include?("No handler for type [text]")
368
+ rescue => e
369
+ if Searchkick.transport_error?(e) && e.message.include?("No handler for type [text]")
366
370
  raise UnsupportedVersionError, "This version of Searchkick requires Elasticsearch 6 or greater"
367
371
  end
368
372
 
@@ -75,7 +75,8 @@ module Searchkick
75
75
  elsif searchkick_index
76
76
  searchkick_index.name
77
77
  else
78
- "_all"
78
+ # fixes warning about accessing system indices
79
+ "*,-.*"
79
80
  end
80
81
 
81
82
  params = {
@@ -112,7 +113,7 @@ module Searchkick
112
113
 
113
114
  # no easy way to tell which host the client will use
114
115
  host =
115
- if Gem::Version.new(Elasticsearch::VERSION) >= Gem::Version.new("7.14.0")
116
+ if Searchkick.client.transport.respond_to?(:transport)
116
117
  Searchkick.client.transport.transport.hosts.first
117
118
  else
118
119
  Searchkick.client.transport.hosts.first
@@ -904,12 +905,7 @@ module Searchkick
904
905
  else
905
906
  # expand ranges
906
907
  if value.is_a?(Range)
907
- # infinite? added in Ruby 2.4
908
- if value.end.nil? || (value.end.respond_to?(:infinite?) && value.end.infinite?)
909
- value = {gte: value.first}
910
- else
911
- value = {gte: value.first, (value.exclude_end? ? :lt : :lte) => value.last}
912
- end
908
+ value = expand_range(value)
913
909
  end
914
910
 
915
911
  value = {in: value} if value.is_a?(Array)
@@ -969,10 +965,10 @@ module Searchkick
969
965
  # \ is escape character
970
966
  # escape Lucene reserved characters
971
967
  # https://www.elastic.co/guide/en/elasticsearch/reference/current/regexp-syntax.html#regexp-optional-operators
972
- reserved = %w(. ? + * | { } [ ] ( ) " \\)
968
+ reserved = %w(\\ . ? + * | { } [ ] ( ) ")
973
969
  regex = op_value.dup
974
970
  reserved.each do |v|
975
- regex.gsub!(v, "\\" + v)
971
+ regex.gsub!(v, "\\\\" + v)
976
972
  end
977
973
  regex = regex.gsub(/(?<!\\)%/, ".*").gsub(/(?<!\\)_/, ".").gsub("\\%", "%").gsub("\\_", "_")
978
974
 
@@ -1138,6 +1134,17 @@ module Searchkick
1138
1134
  end
1139
1135
  end
1140
1136
 
1137
+ def expand_range(range)
1138
+ expanded = {}
1139
+ expanded[:gte] = range.begin if range.begin
1140
+
1141
+ if range.end && !(range.end.respond_to?(:infinite?) && range.end.infinite?)
1142
+ expanded[range.exclude_end? ? :lt : :lte] = range.end
1143
+ end
1144
+
1145
+ expanded
1146
+ end
1147
+
1141
1148
  def base_field(k)
1142
1149
  k.sub(/\.(analyzed|word_start|word_middle|word_end|text_start|text_middle|text_end|exact)\z/, "")
1143
1150
  end
@@ -64,8 +64,9 @@ module Searchkick
64
64
  if record.destroyed? || !record.persisted? || !record.should_index?
65
65
  begin
66
66
  index.remove(record)
67
- rescue Elasticsearch::Transport::Transport::Errors::NotFound
68
- # do nothing
67
+ rescue => e
68
+ raise e unless Searchkick.not_found_error?(e)
69
+ # do nothing if not found
69
70
  end
70
71
  else
71
72
  if method_name
@@ -195,8 +195,8 @@ module Searchkick
195
195
  begin
196
196
  # TODO Active Support notifications for this scroll call
197
197
  Searchkick::Results.new(@klass, Searchkick.client.scroll(scroll: options[:scroll], body: {scroll_id: scroll_id}), @options)
198
- rescue Elasticsearch::Transport::Transport::Errors::NotFound => e
199
- if e.class.to_s =~ /NotFound/ && e.message =~ /search_context_missing_exception/i
198
+ rescue => e
199
+ if Searchkick.not_found_error?(e) && e.message =~ /search_context_missing_exception/i
200
200
  raise Searchkick::Error, "Scroll id has expired"
201
201
  else
202
202
  raise e
@@ -211,8 +211,8 @@ module Searchkick
211
211
  # not required as scroll will expire
212
212
  # but there is a cost to open scrolls
213
213
  Searchkick.client.clear_scroll(scroll_id: scroll_id)
214
- rescue Elasticsearch::Transport::Transport::Error
215
- # do nothing
214
+ rescue => e
215
+ raise e unless Searchkick.transport_error?(e)
216
216
  end
217
217
  end
218
218
 
@@ -1,3 +1,3 @@
1
1
  module Searchkick
2
- VERSION = "4.6.1"
2
+ VERSION = "4.6.3"
3
3
  end
data/lib/searchkick.rb CHANGED
@@ -34,6 +34,7 @@ module Searchkick
34
34
  class Error < StandardError; end
35
35
  class MissingIndexError < Error; end
36
36
  class UnsupportedVersionError < Error; end
37
+ # TODO switch to Error
37
38
  class InvalidQueryError < Elasticsearch::Transport::Transport::Errors::BadRequest; end
38
39
  class DangerousOperation < Error; end
39
40
  class ImportError < Error; end
@@ -278,6 +279,18 @@ module Searchkick
278
279
  !Mongoid::Threaded.current_scope(klass).nil?
279
280
  end
280
281
  end
282
+
283
+ # private
284
+ def self.not_found_error?(e)
285
+ (defined?(Elasticsearch) && e.is_a?(Elasticsearch::Transport::Transport::Errors::NotFound)) ||
286
+ (defined?(OpenSearch) && e.is_a?(OpenSearch::Transport::Transport::Errors::NotFound))
287
+ end
288
+
289
+ # private
290
+ def self.transport_error?(e)
291
+ (defined?(Elasticsearch) && e.is_a?(Elasticsearch::Transport::Transport::Error)) ||
292
+ (defined?(OpenSearch) && e.is_a?(OpenSearch::Transport::Transport::Error))
293
+ end
281
294
  end
282
295
 
283
296
  require "active_model/callbacks"
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.6.1
4
+ version: 4.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-25 00:00:00.000000000 Z
11
+ date: 2021-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel