searchkick 3.1.2 → 3.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bfa26cdc7332a0b73376d46fbd9b66cc093e919d605bbd80ceec04cfbffed914
4
- data.tar.gz: 541e111f81bec56c621b147e5aea2b8017a91eaa3f40d074d1a5aa619da14f14
3
+ metadata.gz: 8fb08ed2716d410bb1d609e873e10387a97e437a6bb63530687998a5b9539e13
4
+ data.tar.gz: f0b43190746e1d841643b1fc45ef8cd86621b42970369cb2c5fb5f02396ca432
5
5
  SHA512:
6
- metadata.gz: ea250f38b93967d245168ab5b0cbb41a86fb0d471df8f5844e2f3e59337630b8a545df059b5fe08fb7582046749e0ffebc2b8d9152e7eee225e04ad7aedb5a54
7
- data.tar.gz: 07f98bb46fd861dc9957ff81931965c3032dccada46e098c9723bcba68fe9365b9927c6d1283ae564aa96f83eaccdd547356de6cf3ccec7fde699a9b9d3ef18e
6
+ metadata.gz: a15444ee63e976df8b85dfb5c5462f48525cd7eb102dc4d0f156e92937223d2cae116c66019821009291bbaeaad56449bf145861c47fa2b729c13e6cf9cf13ac
7
+ data.tar.gz: cff5bee77c65345926199f94ba975db417bbbdcca5cfa7647e004b99c5f7aba3965da700a039f7bd1906d91734de98edcc178dcebfe303a4fa8b7b67bdd3e1dd
@@ -1,3 +1,12 @@
1
+ ## 3.1.3
2
+
3
+ - Added support for endless ranges
4
+ - Added support for routing to `similar` method
5
+ - Added `prefix` to `where`
6
+ - Fixed error with elasticsearch-ruby 6.3
7
+ - Fixed error with some language stemmers and Elasticsearch 6.5
8
+ - Fixed issue with misspellings below and body block
9
+
1
10
  ## 3.1.2
2
11
 
3
12
  - Improved performance of indices boost
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013-2018 Andrew Kane
1
+ Copyright (c) 2013-2019 Andrew Kane
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -22,18 +22,10 @@ Plus:
22
22
  - supports many languages
23
23
  - works with ActiveRecord, Mongoid, and NoBrainer
24
24
 
25
- :speech_balloon: Get [handcrafted updates](https://chartkick.us7.list-manage.com/subscribe?u=952c861f99eb43084e0a49f98&id=6ea6541e8e&group[0][4]=true) for new features
26
-
27
25
  :tangerine: Battle-tested at [Instacart](https://www.instacart.com/opensource)
28
26
 
29
27
  [![Build Status](https://travis-ci.org/ankane/searchkick.svg?branch=master)](https://travis-ci.org/ankane/searchkick)
30
28
 
31
- ---
32
-
33
- Does your company use Searchkick? Want free advising? Fill out [this application](https://goo.gl/forms/Or1HQTRb2rgQCNtd2)
34
-
35
- ---
36
-
37
29
  ## Contents
38
30
 
39
31
  - [Getting Started](#getting-started)
@@ -1461,8 +1453,6 @@ And use the `body` option to search:
1461
1453
  products = Product.search body: {query: {match: {name: "milk"}}}
1462
1454
  ```
1463
1455
 
1464
- **Note:** This replaces the entire body, so other options are ignored.
1465
-
1466
1456
  View the response with:
1467
1457
 
1468
1458
  ```ruby
@@ -1963,11 +1953,6 @@ View the [changelog](https://github.com/ankane/searchkick/blob/master/CHANGELOG.
1963
1953
 
1964
1954
  Thanks to Karel Minarik for [Elasticsearch Ruby](https://github.com/elasticsearch/elasticsearch-ruby) and [Tire](https://github.com/karmi/retire), Jaroslav Kalistsuk for [zero downtime reindexing](https://gist.github.com/jarosan/3124884), and Alex Leschenko for [Elasticsearch autocomplete](https://github.com/leschenko/elasticsearch_autocomplete).
1965
1955
 
1966
- ## Roadmap
1967
-
1968
- - Reindex API
1969
- - Incorporate human eval
1970
-
1971
1956
  ## Contributing
1972
1957
 
1973
1958
  Everyone is encouraged to help improve this project. Here are a few ways you can help:
@@ -1,4 +1,4 @@
1
- require "active_model"
1
+ require "active_support"
2
2
  require "active_support/core_ext/hash/deep_merge"
3
3
  require "elasticsearch"
4
4
  require "hashie"
@@ -17,29 +17,16 @@ require "searchkick/record_indexer"
17
17
  require "searchkick/results"
18
18
  require "searchkick/version"
19
19
 
20
+ require "searchkick/railtie" if defined?(Rails)
20
21
  require "searchkick/logging" if defined?(ActiveSupport::Notifications)
21
22
 
22
- begin
23
- require "rake"
24
- rescue LoadError
25
- # do nothing
26
- end
27
- require "searchkick/tasks" if defined?(Rake)
28
-
29
- # background jobs
30
- begin
31
- require "active_job"
32
- rescue LoadError
33
- # do nothing
34
- end
35
- if defined?(ActiveJob)
36
- require "searchkick/bulk_reindex_job"
37
- require "searchkick/process_batch_job"
38
- require "searchkick/process_queue_job"
39
- require "searchkick/reindex_v2_job"
40
- end
41
-
42
23
  module Searchkick
24
+ # background jobs
25
+ autoload :BulkReindexJob, "searchkick/bulk_reindex_job"
26
+ autoload :ProcessBatchJob, "searchkick/process_batch_job"
27
+ autoload :ProcessQueueJob, "searchkick/process_queue_job"
28
+ autoload :ReindexV2Job, "searchkick/reindex_v2_job"
29
+
43
30
  class Error < StandardError; end
44
31
  class MissingIndexError < Error; end
45
32
  class UnsupportedVersionError < Error; end
@@ -104,8 +91,8 @@ module Searchkick
104
91
  end
105
92
  end
106
93
 
94
+ options = options.merge(block: block) if block
107
95
  query = Searchkick::Query.new(klass, term, options)
108
- block.call(query.body) if block
109
96
  if options[:execute] == false
110
97
  query
111
98
  else
@@ -241,6 +228,7 @@ module Searchkick
241
228
  end
242
229
 
243
230
  # TODO find better ActiveModel hook
231
+ require "active_model/callbacks"
244
232
  ActiveModel::Callbacks.include(Searchkick::Model)
245
233
 
246
234
  ActiveSupport.on_load(:active_record) do
@@ -91,17 +91,22 @@ module Searchkick
91
91
  alias_method :swap, :promote
92
92
 
93
93
  def retrieve(record)
94
- client.get(
95
- index: name,
96
- type: document_type(record),
97
- id: search_id(record)
98
- )["_source"]
94
+ record_data = RecordData.new(self, record).record_data
95
+
96
+ # remove underscore
97
+ get_options = Hash[record_data.map { |k, v| [k.to_s.sub(/\A_/, "").to_sym, v] }]
98
+
99
+ client.get(get_options)["_source"]
99
100
  end
100
101
 
101
102
  def all_indices(unaliased: false)
102
103
  indices =
103
104
  begin
104
- client.indices.get_aliases
105
+ if client.indices.respond_to?(:get_alias)
106
+ client.indices.get_alias
107
+ else
108
+ client.indices.get_aliases
109
+ end
105
110
  rescue Elasticsearch::Transport::Transport::Errors::NotFound
106
111
  {}
107
112
  end
@@ -40,19 +40,19 @@ module Searchkick
40
40
  tokenizer: "standard",
41
41
  # synonym should come last, after stemming and shingle
42
42
  # shingle must come before searchkick_stemmer
43
- filter: ["standard", "lowercase", "asciifolding", "searchkick_index_shingle", "searchkick_stemmer"]
43
+ filter: ["lowercase", "asciifolding", "searchkick_index_shingle", "searchkick_stemmer"]
44
44
  },
45
45
  searchkick_search: {
46
46
  type: "custom",
47
47
  char_filter: ["ampersand"],
48
48
  tokenizer: "standard",
49
- filter: ["standard", "lowercase", "asciifolding", "searchkick_search_shingle", "searchkick_stemmer"]
49
+ filter: ["lowercase", "asciifolding", "searchkick_search_shingle", "searchkick_stemmer"]
50
50
  },
51
51
  searchkick_search2: {
52
52
  type: "custom",
53
53
  char_filter: ["ampersand"],
54
54
  tokenizer: "standard",
55
- filter: ["standard", "lowercase", "asciifolding", "searchkick_stemmer"]
55
+ filter: ["lowercase", "asciifolding", "searchkick_stemmer"]
56
56
  },
57
57
  # https://github.com/leschenko/elasticsearch_autocomplete/blob/master/lib/elasticsearch_autocomplete/analyzers.rb
58
58
  searchkick_autocomplete_search: {
@@ -144,6 +144,17 @@ module Searchkick
144
144
  }
145
145
  }
146
146
 
147
+ if below60
148
+ # ES docs say standard token filter does nothing in ES 5
149
+ # (and therefore isn't needed at at), but tests say otherwise
150
+ # https://www.elastic.co/guide/en/elasticsearch/reference/5.0/analysis-standard-tokenfilter.html
151
+ [default_analyzer, :searchkick_search, :searchkick_search2].each do |analyzer|
152
+ settings[:analysis][:analyzer][analyzer][:filter].unshift("standard")
153
+ end
154
+ end
155
+
156
+ stem = options[:stem]
157
+
147
158
  case language
148
159
  when "chinese"
149
160
  settings[:analysis][:analyzer].merge!(
@@ -158,7 +169,7 @@ module Searchkick
158
169
  }
159
170
  )
160
171
 
161
- settings[:analysis][:filter].delete(:searchkick_stemmer)
172
+ stem = false
162
173
  when "japanese"
163
174
  settings[:analysis][:analyzer].merge!(
164
175
  default_analyzer => {
@@ -171,6 +182,8 @@ module Searchkick
171
182
  type: "kuromoji"
172
183
  }
173
184
  )
185
+
186
+ stem = false
174
187
  when "korean"
175
188
  settings[:analysis][:analyzer].merge!(
176
189
  default_analyzer => {
@@ -183,6 +196,8 @@ module Searchkick
183
196
  type: "openkoreantext-analyzer"
184
197
  }
185
198
  )
199
+
200
+ stem = false
186
201
  when "vietnamese"
187
202
  settings[:analysis][:analyzer].merge!(
188
203
  default_analyzer => {
@@ -195,6 +210,8 @@ module Searchkick
195
210
  type: "vi_analyzer"
196
211
  }
197
212
  )
213
+
214
+ stem = false
198
215
  when "polish", "ukrainian", "smartcn"
199
216
  settings[:analysis][:analyzer].merge!(
200
217
  default_analyzer => {
@@ -207,6 +224,8 @@ module Searchkick
207
224
  type: language
208
225
  }
209
226
  )
227
+
228
+ stem = false
210
229
  end
211
230
 
212
231
  if Searchkick.env == "test"
@@ -231,9 +250,10 @@ module Searchkick
231
250
  end
232
251
  end
233
252
 
234
- if options[:stem] == false
253
+ if stem == false
254
+ settings[:analysis][:filter].delete(:searchkick_stemmer)
235
255
  settings[:analysis][:analyzer].each do |_, analyzer|
236
- analyzer[:filter].delete("searchkick_stemmer")
256
+ analyzer[:filter].delete("searchkick_stemmer") if analyzer[:filter]
237
257
  end
238
258
  end
239
259
 
@@ -15,7 +15,7 @@ module Searchkick
15
15
  :out_of_range?, :hits, :response, :to_a, :first
16
16
 
17
17
  def initialize(klass, term = "*", **options)
18
- unknown_keywords = options.keys - [:aggs, :body, :body_options, :boost,
18
+ unknown_keywords = options.keys - [:aggs, :block, :body, :body_options, :boost,
19
19
  :boost_by, :boost_by_distance, :boost_by_recency, :boost_where, :conversions, :conversions_term, :debug, :emoji, :exclude, :execute, :explain,
20
20
  :fields, :highlight, :includes, :index_name, :indices_boost, :limit, :load,
21
21
  :match, :misspellings, :model_includes, :offset, :operator, :order, :padding, :page, :per_page, :profile,
@@ -483,6 +483,9 @@ module Searchkick
483
483
  # merge more body options
484
484
  payload = payload.deep_merge(options[:body_options]) if options[:body_options]
485
485
 
486
+ # run block
487
+ options[:block].call(payload) if options[:block]
488
+
486
489
  @body = payload
487
490
  @page = page
488
491
  @per_page = per_page
@@ -843,7 +846,12 @@ module Searchkick
843
846
  else
844
847
  # expand ranges
845
848
  if value.is_a?(Range)
846
- value = {gte: value.first, (value.exclude_end? ? :lt : :lte) => value.last}
849
+ # infinite? added in Ruby 2.4
850
+ if value.end.nil? || (value.end.respond_to?(:infinite?) && value.end.infinite?)
851
+ value = {gte: value.first}
852
+ else
853
+ value = {gte: value.first, (value.exclude_end? ? :lt : :lte) => value.last}
854
+ end
847
855
  end
848
856
 
849
857
  value = {in: value} if value.is_a?(Array)
@@ -895,6 +903,8 @@ module Searchkick
895
903
  }
896
904
  }
897
905
  }
906
+ when :prefix
907
+ filters << {prefix: {field => op_value}}
898
908
  when :regexp # support for regexp queries without using a regexp ruby object
899
909
  filters << {regexp: {field => {value: op_value}}}
900
910
  when :not, :_not # not equal
@@ -0,0 +1,7 @@
1
+ module Searckick
2
+ class Railtie < Rails::Railtie
3
+ rake_tasks do
4
+ load "tasks/searchkick.rake"
5
+ end
6
+ end
7
+ end
@@ -39,8 +39,6 @@ module Searchkick
39
39
  @routing_key ||= Searchkick.server_below?("6.0.0") ? :_routing : :routing
40
40
  end
41
41
 
42
- private
43
-
44
42
  def record_data
45
43
  data = {
46
44
  _index: index.name,
@@ -51,6 +49,8 @@ module Searchkick
51
49
  data
52
50
  end
53
51
 
52
+ private
53
+
54
54
  def search_data(method_name = nil)
55
55
  partial_reindex = !method_name.nil?
56
56
 
@@ -1,3 +1,3 @@
1
1
  module Searchkick
2
- VERSION = "3.1.2"
2
+ VERSION = "3.1.3"
3
3
  end
@@ -13,17 +13,15 @@ namespace :searchkick do
13
13
  end
14
14
  end
15
15
 
16
- if defined?(Rails)
17
- namespace :reindex do
18
- desc "reindex all models"
19
- task all: :environment do
20
- Rails.application.eager_load!
21
- Searchkick.models.each do |model|
22
- puts "Reindexing #{model.name}..."
23
- model.reindex
24
- end
25
- puts "Reindex complete"
16
+ namespace :reindex do
17
+ desc "reindex all models"
18
+ task all: :environment do
19
+ Rails.application.eager_load!
20
+ Searchkick.models.each do |model|
21
+ puts "Reindexing #{model.name}..."
22
+ model.reindex
26
23
  end
24
+ puts "Reindex complete"
27
25
  end
28
26
  end
29
27
  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: 3.1.2
4
+ version: 3.1.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: 2018-09-28 00:00:00.000000000 Z
11
+ date: 2019-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -118,13 +118,14 @@ files:
118
118
  - lib/searchkick/process_batch_job.rb
119
119
  - lib/searchkick/process_queue_job.rb
120
120
  - lib/searchkick/query.rb
121
+ - lib/searchkick/railtie.rb
121
122
  - lib/searchkick/record_data.rb
122
123
  - lib/searchkick/record_indexer.rb
123
124
  - lib/searchkick/reindex_queue.rb
124
125
  - lib/searchkick/reindex_v2_job.rb
125
126
  - lib/searchkick/results.rb
126
- - lib/searchkick/tasks.rb
127
127
  - lib/searchkick/version.rb
128
+ - lib/tasks/searchkick.rake
128
129
  homepage: https://github.com/ankane/searchkick
129
130
  licenses:
130
131
  - MIT
@@ -144,9 +145,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
145
  - !ruby/object:Gem::Version
145
146
  version: '0'
146
147
  requirements: []
147
- rubyforge_project:
148
- rubygems_version: 2.7.7
148
+ rubygems_version: 3.0.3
149
149
  signing_key:
150
150
  specification_version: 4
151
- summary: Intelligent search made easy
151
+ summary: Intelligent search made easy with Rails and Elasticsearch
152
152
  test_files: []