searchkick 0.7.4 → 0.7.5
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/CHANGELOG.md +6 -0
- data/README.md +1 -1
- data/lib/searchkick.rb +3 -0
- data/lib/searchkick/index.rb +8 -9
- data/lib/searchkick/query.rb +8 -2
- data/lib/searchkick/reindex.rb +0 -5
- data/lib/searchkick/results.rb +9 -3
- data/lib/searchkick/version.rb +1 -1
- data/test/index_test.rb +29 -0
- data/test/sql_test.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2b3dc0e591516c6ddd76101c1053211ae7f9fe9
|
4
|
+
data.tar.gz: f56695cbbfcc4e92b6d751add7c00ec6bbdb82ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a4ca76c448e90b4d838aa1e0076b01355866b837a046618222aaa7e65b9142b3370c8f93fc622be57e248a5ed8fd4941155fa915dda118c1781893266c832c6
|
7
|
+
data.tar.gz: 2d7f62a4329cf8005f57ae60968f3e2aea626cff87e5073a8fa141250ec135424ba8bb2ccff46ddf8033bdf07d05ecad3dec59fceeb5d67d044911e7ffa9f561
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -353,7 +353,7 @@ Typically, you want to use a JavaScript library like [typeahead.js](http://twitt
|
|
353
353
|
|
354
354
|
#### Here’s how to make it work with Rails
|
355
355
|
|
356
|
-
First, add a controller action.
|
356
|
+
First, add a route and controller action.
|
357
357
|
|
358
358
|
```ruby
|
359
359
|
# app/controllers/cities_controller.rb
|
data/lib/searchkick.rb
CHANGED
@@ -13,6 +13,9 @@ require "searchkick/tasks"
|
|
13
13
|
require "searchkick/logging" if defined?(Rails)
|
14
14
|
|
15
15
|
module Searchkick
|
16
|
+
class MissingIndexError < StandardError; end
|
17
|
+
class UnsupportedVersionError < StandardError; end
|
18
|
+
class InvalidQueryError < Elasticsearch::Transport::Transport::Errors::BadRequest; end
|
16
19
|
|
17
20
|
def self.client
|
18
21
|
@client ||= Elasticsearch::Client.new(url: ENV["ELASTICSEARCH_URL"])
|
data/lib/searchkick/index.rb
CHANGED
@@ -26,7 +26,7 @@ module Searchkick
|
|
26
26
|
client.index(
|
27
27
|
index: name,
|
28
28
|
type: document_type(record),
|
29
|
-
id: record
|
29
|
+
id: search_id(record),
|
30
30
|
body: search_data(record)
|
31
31
|
)
|
32
32
|
end
|
@@ -35,7 +35,7 @@ module Searchkick
|
|
35
35
|
client.delete(
|
36
36
|
index: name,
|
37
37
|
type: document_type(record),
|
38
|
-
id: record
|
38
|
+
id: search_id(record)
|
39
39
|
)
|
40
40
|
end
|
41
41
|
|
@@ -44,7 +44,7 @@ module Searchkick
|
|
44
44
|
client.bulk(
|
45
45
|
index: name,
|
46
46
|
type: type,
|
47
|
-
body: batch.map{|r| data = search_data(r); {index: {_id:
|
47
|
+
body: batch.map{|r| data = search_data(r); {index: {_id: search_id(r), data: data}} }
|
48
48
|
)
|
49
49
|
end
|
50
50
|
end
|
@@ -71,16 +71,15 @@ module Searchkick
|
|
71
71
|
klass_document_type(record.class)
|
72
72
|
end
|
73
73
|
|
74
|
+
def search_id(record)
|
75
|
+
record.id.is_a?(Numeric) ? record.id : record.id.to_s
|
76
|
+
end
|
77
|
+
|
74
78
|
def search_data(record)
|
75
79
|
source = record.search_data
|
76
80
|
|
77
81
|
# stringify fields
|
78
|
-
source = source.inject({}){|memo,(k,v)| memo[k.to_s] = v; memo}
|
79
|
-
|
80
|
-
# Mongoid 4 hack
|
81
|
-
if defined?(BSON::ObjectId) and source["_id"].is_a?(BSON::ObjectId)
|
82
|
-
source["_id"] = source["_id"].to_s
|
83
|
-
end
|
82
|
+
source = source.inject({}){|memo,(k,v)| memo[k.to_s] = v; memo}.except("id", "_id")
|
84
83
|
|
85
84
|
options = record.class.searchkick_options
|
86
85
|
|
data/lib/searchkick/query.rb
CHANGED
@@ -328,7 +328,7 @@ module Searchkick
|
|
328
328
|
rescue => e # TODO rescue type
|
329
329
|
status_code = e.message[1..3].to_i
|
330
330
|
if status_code == 404
|
331
|
-
raise "Index missing - run #{searchkick_klass.name}.reindex"
|
331
|
+
raise MissingIndexError, "Index missing - run #{searchkick_klass.name}.reindex"
|
332
332
|
elsif status_code == 500 and (
|
333
333
|
e.message.include?("IllegalArgumentException[minimumSimilarity >= 1]") or
|
334
334
|
e.message.include?("No query registered for [multi_match]") or
|
@@ -336,7 +336,13 @@ module Searchkick
|
|
336
336
|
e.message.include?("No query registered for [function_score]]")
|
337
337
|
)
|
338
338
|
|
339
|
-
raise "This version of Searchkick requires Elasticsearch 0.90.4 or greater"
|
339
|
+
raise UnsupportedVersionError, "This version of Searchkick requires Elasticsearch 0.90.4 or greater"
|
340
|
+
elsif status_code == 400
|
341
|
+
if e.message.include?("[multi_match] analyzer [searchkick_search] not found")
|
342
|
+
raise InvalidQueryError, "Bad mapping - run #{searchkick_klass.name}.reindex"
|
343
|
+
else
|
344
|
+
raise InvalidQueryError, e.message
|
345
|
+
end
|
340
346
|
else
|
341
347
|
raise e
|
342
348
|
end
|
data/lib/searchkick/reindex.rb
CHANGED
@@ -127,11 +127,6 @@ module Searchkick
|
|
127
127
|
tokenizer: "standard",
|
128
128
|
filter: ["lowercase", "asciifolding", "searchkick_suggest_shingle"]
|
129
129
|
},
|
130
|
-
searchkick_suggest_index: {
|
131
|
-
type: "custom",
|
132
|
-
tokenizer: "standard",
|
133
|
-
filter: ["lowercase", "asciifolding", "searchkick_suggest_shingle"]
|
134
|
-
},
|
135
130
|
searchkick_text_start_index: {
|
136
131
|
type: "custom",
|
137
132
|
tokenizer: "keyword",
|
data/lib/searchkick/results.rb
CHANGED
@@ -24,13 +24,18 @@ module Searchkick
|
|
24
24
|
if options[:includes]
|
25
25
|
records = records.includes(options[:includes])
|
26
26
|
end
|
27
|
-
results[type] =
|
27
|
+
results[type] =
|
28
|
+
if records.respond_to?(:primary_key)
|
29
|
+
records.where(records.primary_key => grouped_hits.map{|hit| hit["_id"] }).to_a
|
30
|
+
else
|
31
|
+
records.queryable.for_ids(grouped_hits.map{|hit| hit["_id"] }).to_a
|
32
|
+
end
|
28
33
|
end
|
29
34
|
|
30
35
|
# sort
|
31
36
|
hits.map do |hit|
|
32
37
|
results[hit["_type"]].find{|r| r.id.to_s == hit["_id"].to_s }
|
33
|
-
end
|
38
|
+
end.compact
|
34
39
|
else
|
35
40
|
hits.map do |hit|
|
36
41
|
result = hit.except("_source").merge(hit["_source"])
|
@@ -88,9 +93,10 @@ module Searchkick
|
|
88
93
|
def total_pages
|
89
94
|
(total_count / per_page.to_f).ceil
|
90
95
|
end
|
96
|
+
alias_method :num_pages, :total_pages
|
91
97
|
|
92
98
|
def offset_value
|
93
|
-
current_page * per_page
|
99
|
+
(current_page - 1) * per_page
|
94
100
|
end
|
95
101
|
alias_method :offset, :offset_value
|
96
102
|
|
data/lib/searchkick/version.rb
CHANGED
data/test/index_test.rb
CHANGED
@@ -35,6 +35,35 @@ class TestIndex < Minitest::Unit::TestCase
|
|
35
35
|
assert_equal ["Dollar Tree"], Store.search(query: {match: {name: "Dollar Tree"}}).map(&:name)
|
36
36
|
end
|
37
37
|
|
38
|
+
def test_record_not_found
|
39
|
+
store_names ["Product A", "Product B"]
|
40
|
+
Product.where(name: "Product A").delete_all
|
41
|
+
assert_search "product", ["Product B"]
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_bad_mapping
|
45
|
+
Product.searchkick_index.delete
|
46
|
+
store_names ["Product A"]
|
47
|
+
assert_raises(Searchkick::InvalidQueryError){ Product.search "test" }
|
48
|
+
ensure
|
49
|
+
Product.reindex
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_missing_index
|
53
|
+
assert_raises(Searchkick::MissingIndexError){ Product.search "test", index_name: "not_found" }
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_unsupported_version
|
57
|
+
raises_exception = lambda { |s| raise Elasticsearch::Transport::Transport::Error.new("[500] No query registered for [multi_match]") }
|
58
|
+
Searchkick.client.stub :search, raises_exception do
|
59
|
+
assert_raises(Searchkick::UnsupportedVersionError){ Product.search("test") }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_invalid_query
|
64
|
+
assert_raises(Searchkick::InvalidQueryError){ Product.search(query: {}) }
|
65
|
+
end
|
66
|
+
|
38
67
|
if defined?(ActiveRecord)
|
39
68
|
|
40
69
|
def test_transaction
|
data/test/sql_test.rb
CHANGED
@@ -30,8 +30,8 @@ class TestSql < Minitest::Unit::TestCase
|
|
30
30
|
assert_equal 5, products.total_count
|
31
31
|
assert_equal 5, products.total_entries
|
32
32
|
assert_equal 2, products.limit_value
|
33
|
-
assert_equal
|
34
|
-
assert_equal
|
33
|
+
assert_equal 2, products.offset_value
|
34
|
+
assert_equal 2, products.offset
|
35
35
|
assert !products.first_page?
|
36
36
|
assert !products.last_page?
|
37
37
|
assert !products.empty?
|
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.7.
|
4
|
+
version: 0.7.5
|
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-05-
|
11
|
+
date: 2014-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|