searchkick 3.1.2 → 3.1.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: 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: []