searchkick 0.8.2 → 0.8.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 +4 -4
- data/.travis.yml +6 -2
- data/CHANGELOG.md +6 -0
- data/Gemfile +2 -3
- data/README.md +15 -1
- data/gemfiles/activerecord31.gemfile +7 -0
- data/gemfiles/activerecord32.gemfile +7 -0
- data/gemfiles/activerecord40.gemfile +8 -0
- data/gemfiles/mongoid4.gemfile +1 -0
- data/lib/searchkick.rb +15 -1
- data/lib/searchkick/logging.rb +8 -6
- data/lib/searchkick/model.rb +5 -3
- data/lib/searchkick/reindex.rb +10 -7
- data/lib/searchkick/reindex_v2_job.rb +24 -0
- data/lib/searchkick/results.rb +4 -0
- data/lib/searchkick/version.rb +1 -1
- data/test/highlight_test.rb +5 -0
- data/test/index_test.rb +2 -0
- data/test/reindex_job_test.rb +2 -2
- data/test/reindex_v2_job_test.rb +34 -0
- data/test/sql_test.rb +1 -0
- data/test/suggest_test.rb +2 -1
- data/test/test_helper.rb +6 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b8b951d29bd106ae56b6ca7d2738574430f76ae
|
4
|
+
data.tar.gz: a56ba366f77bfb6f0378e8f5711704bec31ef2cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f532ecc2e7bb89ad4a705400c89151d7b5ab114efc7c8d4fa9771578de22a3e3ed5361863b6cea9cf56ea9ab6cf4b3379899168af619242844035197c1b294a
|
7
|
+
data.tar.gz: 37c8d654358714fc2a5389190940fdf5f9714b60ded559364ec28ea6a639ed69570f80495e004e2d17c3354e8aada69b7f5e9cf062176f595d4e626024921b1c
|
data/.travis.yml
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
- 1
|
4
|
-
- 2.0.0
|
3
|
+
- 2.1
|
5
4
|
services:
|
6
5
|
- elasticsearch
|
7
6
|
- mongodb
|
7
|
+
before_install:
|
8
|
+
- wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.2.deb && sudo dpkg -i elasticsearch-1.3.2.deb && sudo service elasticsearch restart
|
8
9
|
script: bundle exec rake test
|
9
10
|
before_script:
|
10
11
|
- psql -c 'create database searchkick_test;' -U postgres
|
@@ -14,6 +15,9 @@ notifications:
|
|
14
15
|
on_failure: change
|
15
16
|
gemfile:
|
16
17
|
- Gemfile
|
18
|
+
- gemfiles/activerecord40.gemfile
|
19
|
+
- gemfiles/activerecord32.gemfile
|
20
|
+
- gemfiles/activerecord31.gemfile
|
17
21
|
- gemfiles/mongoid2.gemfile
|
18
22
|
- gemfiles/mongoid3.gemfile
|
19
23
|
- gemfiles/mongoid4.gemfile
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -343,7 +343,7 @@ There are three strategies for keeping the index synced with your database.
|
|
343
343
|
end
|
344
344
|
```
|
345
345
|
|
346
|
-
|
346
|
+
And [install Active Job](https://github.com/ankane/activejob_backport) for Rails 4.1 and below
|
347
347
|
|
348
348
|
3. Manual
|
349
349
|
|
@@ -539,6 +539,14 @@ Product.search "*", facets: {store_id: {stats: true}}
|
|
539
539
|
|
540
540
|
### Highlight
|
541
541
|
|
542
|
+
Specify which fields to index with highlighting.
|
543
|
+
|
544
|
+
```ruby
|
545
|
+
class Product < ActiveRecord::Base
|
546
|
+
searchkick highlight: [:name]
|
547
|
+
end
|
548
|
+
```
|
549
|
+
|
542
550
|
Highlight the search query in the results.
|
543
551
|
|
544
552
|
```ruby
|
@@ -801,6 +809,12 @@ Product.enable_search_callbacks # or use Searchkick.enable_callbacks for all mod
|
|
801
809
|
Product.reindex
|
802
810
|
```
|
803
811
|
|
812
|
+
Change timeout
|
813
|
+
|
814
|
+
```ruby
|
815
|
+
Searchkick.timeout = 5 # defaults to 10
|
816
|
+
```
|
817
|
+
|
804
818
|
Change the search method name in `config/initializers/searchkick.rb`
|
805
819
|
|
806
820
|
```ruby
|
data/gemfiles/mongoid4.gemfile
CHANGED
data/lib/searchkick.rb
CHANGED
@@ -12,6 +12,14 @@ require "searchkick/model"
|
|
12
12
|
require "searchkick/tasks"
|
13
13
|
require "searchkick/logging" if defined?(Rails)
|
14
14
|
|
15
|
+
# background jobs
|
16
|
+
begin
|
17
|
+
require "active_job"
|
18
|
+
rescue LoadError
|
19
|
+
# do nothing
|
20
|
+
end
|
21
|
+
require "searchkick/reindex_v2_job" if defined?(ActiveJob)
|
22
|
+
|
15
23
|
module Searchkick
|
16
24
|
class MissingIndexError < StandardError; end
|
17
25
|
class UnsupportedVersionError < StandardError; end
|
@@ -21,13 +29,19 @@ module Searchkick
|
|
21
29
|
attr_accessor :callbacks
|
22
30
|
attr_accessor :search_method_name
|
23
31
|
attr_accessor :wordnet_path
|
32
|
+
attr_accessor :timeout
|
24
33
|
end
|
25
34
|
self.callbacks = true
|
26
35
|
self.search_method_name = :search
|
27
36
|
self.wordnet_path = "/var/lib/wn_s.pl"
|
37
|
+
self.timeout = 10
|
28
38
|
|
29
39
|
def self.client
|
30
|
-
@client ||=
|
40
|
+
@client ||=
|
41
|
+
Elasticsearch::Client.new(
|
42
|
+
url: ENV["ELASTICSEARCH_URL"],
|
43
|
+
transport_options: {request: {timeout: timeout}}
|
44
|
+
)
|
31
45
|
end
|
32
46
|
|
33
47
|
def self.client=(client)
|
data/lib/searchkick/logging.rb
CHANGED
@@ -38,12 +38,14 @@ module Searchkick
|
|
38
38
|
alias_method_chain :remove, :instrumentation
|
39
39
|
|
40
40
|
def import_with_instrumentation(records)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
41
|
+
if records.any?
|
42
|
+
event = {
|
43
|
+
name: "#{records.first.searchkick_klass.name} Import",
|
44
|
+
count: records.size
|
45
|
+
}
|
46
|
+
ActiveSupport::Notifications.instrument("request.searchkick", event) do
|
47
|
+
import_without_instrumentation(records)
|
48
|
+
end
|
47
49
|
end
|
48
50
|
end
|
49
51
|
alias_method_chain :import, :instrumentation
|
data/lib/searchkick/model.rb
CHANGED
@@ -32,9 +32,11 @@ module Searchkick
|
|
32
32
|
extend Searchkick::Reindex
|
33
33
|
include Searchkick::Similar
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
def reindex_async
|
36
|
+
if defined?(Searchkick::ReindexV2Job)
|
37
|
+
Searchkick::ReindexV2Job.perform_later(self.class.name, id.to_s)
|
38
|
+
else
|
39
|
+
Delayed::Job.enqueue Searchkick::ReindexJob.new(self.class.name, id.to_s)
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
data/lib/searchkick/reindex.rb
CHANGED
@@ -17,7 +17,7 @@ module Searchkick
|
|
17
17
|
# check if alias exists
|
18
18
|
if Searchkick.client.indices.exists_alias(name: alias_name)
|
19
19
|
# import before swap
|
20
|
-
searchkick_import(index) unless skip_import
|
20
|
+
searchkick_import(index: index) unless skip_import
|
21
21
|
|
22
22
|
# get existing indices to remove
|
23
23
|
old_indices = Searchkick.client.indices.get_alias(name: alias_name).keys
|
@@ -29,7 +29,7 @@ module Searchkick
|
|
29
29
|
Searchkick.client.indices.update_aliases body: {actions: [{add: {index: new_name, alias: alias_name}}]}
|
30
30
|
|
31
31
|
# import after swap
|
32
|
-
searchkick_import(index) unless skip_import
|
32
|
+
searchkick_import(index: index) unless skip_import
|
33
33
|
end
|
34
34
|
|
35
35
|
index.refresh
|
@@ -52,9 +52,8 @@ module Searchkick
|
|
52
52
|
@descendents << klass unless @descendents.include?(klass)
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
def searchkick_import(index)
|
55
|
+
def searchkick_import(options = {})
|
56
|
+
index = options[:index] || searchkick_index
|
58
57
|
batch_size = searchkick_options[:batch_size] || 1000
|
59
58
|
|
60
59
|
# use scope for import
|
@@ -261,7 +260,7 @@ module Searchkick
|
|
261
260
|
end
|
262
261
|
|
263
262
|
mapping_options = Hash[
|
264
|
-
[:autocomplete, :suggest, :text_start, :text_middle, :text_end, :word_start, :word_middle, :word_end]
|
263
|
+
[:autocomplete, :suggest, :text_start, :text_middle, :text_end, :word_start, :word_middle, :word_end, :highlight]
|
265
264
|
.map{|type| [type, (options[type] || []).map(&:to_s)] }
|
266
265
|
]
|
267
266
|
|
@@ -276,12 +275,16 @@ module Searchkick
|
|
276
275
|
}
|
277
276
|
}
|
278
277
|
|
279
|
-
mapping_options.each do |type, fields|
|
278
|
+
mapping_options.except(:highlight).each do |type, fields|
|
280
279
|
if fields.include?(field)
|
281
280
|
field_mapping[:fields][type] = {type: "string", index: "analyzed", analyzer: "searchkick_#{type}_index"}
|
282
281
|
end
|
283
282
|
end
|
284
283
|
|
284
|
+
if mapping_options[:highlight].include?(field)
|
285
|
+
field_mapping[:fields]["analyzed"][:term_vector] = "with_positions_offsets"
|
286
|
+
end
|
287
|
+
|
285
288
|
mapping[field] = field_mapping
|
286
289
|
end
|
287
290
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Searchkick
|
2
|
+
class ReindexV2Job < ActiveJob::Base
|
3
|
+
queue_as :searchkick
|
4
|
+
|
5
|
+
def perform(klass, id)
|
6
|
+
model = klass.constantize
|
7
|
+
record = model.find(id) rescue nil # TODO fix lazy coding
|
8
|
+
index = model.searchkick_index
|
9
|
+
if !record or !record.should_index?
|
10
|
+
# hacky
|
11
|
+
record ||= model.new
|
12
|
+
record.id = id
|
13
|
+
begin
|
14
|
+
index.remove record
|
15
|
+
rescue Elasticsearch::Transport::Transport::Errors::NotFound
|
16
|
+
# do nothing
|
17
|
+
end
|
18
|
+
else
|
19
|
+
index.store record
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/lib/searchkick/results.rb
CHANGED
data/lib/searchkick/version.rb
CHANGED
data/test/highlight_test.rb
CHANGED
@@ -19,6 +19,11 @@ class TestHighlight < Minitest::Test
|
|
19
19
|
assert_equal "<em>Cinema</em> Orange", highlight[:color]
|
20
20
|
end
|
21
21
|
|
22
|
+
def test_multiple_words
|
23
|
+
store_names ["Hello World Hello"]
|
24
|
+
assert_equal "<em>Hello</em> World <em>Hello</em>", Product.search("hello", fields: [:name], highlight: true).with_details.first[1][:highlight][:name]
|
25
|
+
end
|
26
|
+
|
22
27
|
def test_json
|
23
28
|
store_names ["Two Door Cinema Club"]
|
24
29
|
json = {
|
data/test/index_test.rb
CHANGED
data/test/reindex_job_test.rb
CHANGED
@@ -15,7 +15,7 @@ class TestReindexJob < Minitest::Test
|
|
15
15
|
product = Product.create!(name: "Boom")
|
16
16
|
Product.searchkick_index.refresh
|
17
17
|
assert_search "*", []
|
18
|
-
Searchkick::ReindexJob.new("Product", product.id).perform
|
18
|
+
Searchkick::ReindexJob.new("Product", product.id.to_s).perform
|
19
19
|
Product.searchkick_index.refresh
|
20
20
|
assert_search "*", ["Boom"]
|
21
21
|
end
|
@@ -25,7 +25,7 @@ class TestReindexJob < Minitest::Test
|
|
25
25
|
Product.reindex
|
26
26
|
assert_search "*", ["Boom"]
|
27
27
|
product.destroy
|
28
|
-
Searchkick::ReindexJob.new("Product", product.id).perform
|
28
|
+
Searchkick::ReindexJob.new("Product", product.id.to_s).perform
|
29
29
|
Product.searchkick_index.refresh
|
30
30
|
assert_search "*", []
|
31
31
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class TestReindexV2Job < Minitest::Test
|
4
|
+
|
5
|
+
def setup
|
6
|
+
skip if !defined?(ActiveJob)
|
7
|
+
super
|
8
|
+
Searchkick.disable_callbacks
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
Searchkick.enable_callbacks
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_create
|
16
|
+
product = Product.create!(name: "Boom")
|
17
|
+
Product.searchkick_index.refresh
|
18
|
+
assert_search "*", []
|
19
|
+
Searchkick::ReindexV2Job.perform_later("Product", product.id.to_s)
|
20
|
+
Product.searchkick_index.refresh
|
21
|
+
assert_search "*", ["Boom"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_destroy
|
25
|
+
product = Product.create!(name: "Boom")
|
26
|
+
Product.reindex
|
27
|
+
assert_search "*", ["Boom"]
|
28
|
+
product.destroy
|
29
|
+
Searchkick::ReindexV2Job.perform_later("Product", product.id.to_s)
|
30
|
+
Product.searchkick_index.refresh
|
31
|
+
assert_search "*", []
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/test/sql_test.rb
CHANGED
@@ -22,6 +22,7 @@ class TestSql < Minitest::Test
|
|
22
22
|
store_names ["Product A", "Product B", "Product C", "Product D", "Product E", "Product F"]
|
23
23
|
products = Product.search("product", order: {name: :asc}, page: 2, per_page: 2, padding: 1)
|
24
24
|
assert_equal ["Product D", "Product E"], products.map(&:name)
|
25
|
+
assert_equal "product", products.entry_name
|
25
26
|
assert_equal 2, products.current_page
|
26
27
|
assert_equal 1, products.padding
|
27
28
|
assert_equal 2, products.per_page
|
data/test/suggest_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -11,6 +11,10 @@ Minitest::Test = Minitest::Unit::TestCase unless defined?(Minitest::Test)
|
|
11
11
|
File.delete("elasticsearch.log") if File.exists?("elasticsearch.log")
|
12
12
|
Searchkick.client.transport.logger = Logger.new("elasticsearch.log")
|
13
13
|
|
14
|
+
I18n.config.enforce_available_locales = true
|
15
|
+
|
16
|
+
ActiveJob::Base.logger = nil if defined?(ActiveJob)
|
17
|
+
|
14
18
|
if defined?(Mongoid)
|
15
19
|
|
16
20
|
def mongoid2?
|
@@ -141,7 +145,8 @@ class Product
|
|
141
145
|
text_end: [:name],
|
142
146
|
word_start: [:name],
|
143
147
|
word_middle: [:name],
|
144
|
-
word_end: [:name]
|
148
|
+
word_end: [:name],
|
149
|
+
highlight: [:name]
|
145
150
|
|
146
151
|
attr_accessor :conversions, :user_ids, :aisle
|
147
152
|
|
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: 0.8.
|
4
|
+
version: 0.8.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: 2014-
|
11
|
+
date: 2014-09-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -108,6 +108,9 @@ files:
|
|
108
108
|
- LICENSE.txt
|
109
109
|
- README.md
|
110
110
|
- Rakefile
|
111
|
+
- gemfiles/activerecord31.gemfile
|
112
|
+
- gemfiles/activerecord32.gemfile
|
113
|
+
- gemfiles/activerecord40.gemfile
|
111
114
|
- gemfiles/mongoid2.gemfile
|
112
115
|
- gemfiles/mongoid3.gemfile
|
113
116
|
- gemfiles/mongoid4.gemfile
|
@@ -118,6 +121,7 @@ files:
|
|
118
121
|
- lib/searchkick/query.rb
|
119
122
|
- lib/searchkick/reindex.rb
|
120
123
|
- lib/searchkick/reindex_job.rb
|
124
|
+
- lib/searchkick/reindex_v2_job.rb
|
121
125
|
- lib/searchkick/results.rb
|
122
126
|
- lib/searchkick/similar.rb
|
123
127
|
- lib/searchkick/tasks.rb
|
@@ -133,6 +137,7 @@ files:
|
|
133
137
|
- test/model_test.rb
|
134
138
|
- test/query_test.rb
|
135
139
|
- test/reindex_job_test.rb
|
140
|
+
- test/reindex_v2_job_test.rb
|
136
141
|
- test/should_index_test.rb
|
137
142
|
- test/similar_test.rb
|
138
143
|
- test/sql_test.rb
|
@@ -176,6 +181,7 @@ test_files:
|
|
176
181
|
- test/model_test.rb
|
177
182
|
- test/query_test.rb
|
178
183
|
- test/reindex_job_test.rb
|
184
|
+
- test/reindex_v2_job_test.rb
|
179
185
|
- test/should_index_test.rb
|
180
186
|
- test/similar_test.rb
|
181
187
|
- test/sql_test.rb
|