searchkick 0.7.9 → 0.8.0

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
  SHA1:
3
- metadata.gz: e2bc8db79f3c60a5694ccd3400713d0dc8788ffd
4
- data.tar.gz: 163dfde8a0f72d3f9584ad7e6f94b6370bafceb3
3
+ metadata.gz: d97f04a7f7678a643933cfd0045ec2e6043ebf02
4
+ data.tar.gz: c817fb9f49a0b6526beb3a2a2d5266c451258cfe
5
5
  SHA512:
6
- metadata.gz: 83f9f13181e205843a72d3539b4ebba790c98f3abdbb9f1be1a3bfda539eb415304bd8e9eaf9acea062f64f6dbbc227db0892cd76623178d0ab20783119a91d4
7
- data.tar.gz: 2123d48c3269eb517108f8864740bb2d1cfdc3e0130ed99c161a51d09d97f24799625fc83896912ce4351cfd678434665cefcf176935c2b08f5b5006a23d031a
6
+ metadata.gz: c19441dd8e684d5c1d0b4613dce000535dbd527ff35fce233bcdaba960037c9ec2853c1539ce8b038f3880a30c0a2be7717363f87be93b0789440718509c8c8c
7
+ data.tar.gz: 247238fb70ade1d5ce6eeff5ddd3c0bf590bec9bb52e8e746fe12db58ffb7bf5bdde5f6385bc4167b8dd67bc151724b215253b15755e1cb75f30ec07fac1c025
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.8.0
2
+
3
+ - Added support for Elasticsearch 1.2
4
+
1
5
  ## 0.7.9
2
6
 
3
7
  - Added `tokens` method
data/README.md CHANGED
@@ -45,12 +45,6 @@ Add this line to your application’s Gemfile:
45
45
  gem 'searchkick'
46
46
  ```
47
47
 
48
- For Elasticsearch 1.2, use:
49
-
50
- ```ruby
51
- gem 'searchkick', github: 'ankane/searchkick', branch: 'elasticsearch-1.2'
52
- ```
53
-
54
48
  For Elasticsearch 0.90, use version `0.6.3` and [this readme](https://github.com/ankane/searchkick/blob/v0.6.3/README.md).
55
49
 
56
50
  Add searchkick to models you want to search.
@@ -161,11 +155,20 @@ Plays nicely with kaminari and will_paginate.
161
155
  ```ruby
162
156
  # controller
163
157
  @products = Product.search "milk", page: params[:page], per_page: 20
158
+ ```
159
+
160
+ View with kaminari
164
161
 
165
- # view
162
+ ```erb
166
163
  <%= paginate @products %>
167
164
  ```
168
165
 
166
+ View with will_paginate
167
+
168
+ ```erb
169
+ <%= will_paginate @products %>
170
+ ```
171
+
169
172
  ### Partial Matches
170
173
 
171
174
  By default, results must match all words in the query.
@@ -215,7 +218,7 @@ fields: [{"name^2" => :word_start}] # better interface on the way
215
218
  ### Exact Matches
216
219
 
217
220
  ```ruby
218
- User.search "hi@searchkick.org", fields: [{email: :exact}]
221
+ User.search "hi@searchkick.org", fields: [{email: :exact}, :name]
219
222
  ```
220
223
 
221
224
  ### Language
@@ -640,6 +643,16 @@ Then deploy and reindex:
640
643
  rake searchkick:reindex CLASS=Product
641
644
  ```
642
645
 
646
+ ### Performance
647
+
648
+ For the best performance, add [Patron](https://github.com/toland/patron) to your Gemfile.
649
+
650
+ ```ruby
651
+ gem 'patron'
652
+ ```
653
+
654
+ **Note:** Patron is not available for Windows.
655
+
643
656
  ### Automatic Failover
644
657
 
645
658
  Create an initializer `config/initializers/elasticsearch.rb` with multiple hosts:
data/lib/searchkick.rb CHANGED
@@ -25,6 +25,10 @@ module Searchkick
25
25
  @client = client
26
26
  end
27
27
 
28
+ def self.server_version
29
+ @server_version ||= client.info["version"]["number"]
30
+ end
31
+
28
32
  @callbacks = true
29
33
 
30
34
  def self.enable_callbacks
@@ -6,7 +6,7 @@ module Searchkick
6
6
  def initialize(klass, term, options = {})
7
7
  if term.is_a?(Hash)
8
8
  options = term
9
- term = nil
9
+ term = "*"
10
10
  else
11
11
  term = term.to_s
12
12
  end
@@ -15,6 +15,8 @@ module Searchkick
15
15
  @term = term
16
16
  @options = options
17
17
 
18
+ below12 = Gem::Version.new(Searchkick.server_version) < Gem::Version.new("1.2")
19
+
18
20
  boost_fields = {}
19
21
  fields =
20
22
  if options[:fields]
@@ -127,6 +129,13 @@ module Searchkick
127
129
 
128
130
  if conversions_field and options[:conversions] != false
129
131
  # wrap payload in a bool query
132
+ script_score =
133
+ if below12
134
+ {script_score: {script: "doc['count'].value"}}
135
+ else
136
+ {field_value_factor: {field: "count"}}
137
+ end
138
+
130
139
  payload = {
131
140
  bool: {
132
141
  must: payload,
@@ -141,11 +150,8 @@ module Searchkick
141
150
  match: {
142
151
  query: term
143
152
  }
144
- },
145
- script_score: {
146
- script: "doc['count'].value"
147
153
  }
148
- }
154
+ }.merge(script_score)
149
155
  }
150
156
  }
151
157
  }
@@ -165,16 +171,20 @@ module Searchkick
165
171
  end
166
172
 
167
173
  boost_by.each do |field, value|
174
+ script_score =
175
+ if below12
176
+ {script_score: {script: "#{value[:factor].to_f} * log(doc['#{field}'].value + 2.718281828)"}}
177
+ else
178
+ {field_value_factor: {field: field, factor: value[:factor].to_f, modifier: "ln2p"}}
179
+ end
180
+
168
181
  custom_filters << {
169
182
  filter: {
170
183
  exists: {
171
184
  field: field
172
185
  }
173
- },
174
- script_score: {
175
- script: "#{value[:factor].to_f} * log(doc['#{field}'].value + 2.718281828)"
176
186
  }
177
- }
187
+ }.merge(script_score)
178
188
  end
179
189
 
180
190
  boost_where = options[:boost_where] || {}
@@ -370,7 +380,7 @@ module Searchkick
370
380
  e.message.include?("No query registered for [function_score]]")
371
381
  )
372
382
 
373
- raise UnsupportedVersionError, "This version of Searchkick requires Elasticsearch 0.90.4 or greater"
383
+ raise UnsupportedVersionError, "This version of Searchkick requires Elasticsearch 1.0 or greater"
374
384
  elsif status_code == 400
375
385
  if e.message.include?("[multi_match] analyzer [searchkick_search] not found")
376
386
  raise InvalidQueryError, "Bad mapping - run #{searchkick_klass.name}.reindex"
@@ -1,7 +1,7 @@
1
1
  module Searchkick
2
2
  module Search
3
3
 
4
- def search(term, options = {})
4
+ def search(term = nil, options = {})
5
5
  query = Searchkick::Query.new(self, term, options)
6
6
  if options[:execute] == false
7
7
  query
@@ -1,3 +1,3 @@
1
1
  module Searchkick
2
- VERSION = "0.7.9"
2
+ VERSION = "0.8.0"
3
3
  end
data/searchkick.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "activemodel"
22
- spec.add_dependency "elasticsearch", "~> 0.4.11"
22
+ spec.add_dependency "elasticsearch", ">= 1"
23
23
  spec.add_dependency "hashie"
24
24
 
25
25
  spec.add_development_dependency "bundler", "~> 1.3"
data/test/match_test.rb CHANGED
@@ -139,6 +139,15 @@ class TestMatch < Minitest::Unit::TestCase
139
139
  assert_search "*", ["Product A", "Product B"]
140
140
  end
141
141
 
142
+ def test_no_arguments
143
+ assert_equal [], Product.search.to_a
144
+ end
145
+
146
+ def test_no_term
147
+ store_names ["Product A"]
148
+ assert_equal ["Product A"], Product.search(where: {name: "Product A"}).map(&:name)
149
+ end
150
+
142
151
  def test_to_be_or_not_to_be
143
152
  store_names ["to be or not to be"]
144
153
  assert_search "to be", ["to be or not to be"]
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.9
4
+ version: 0.8.0
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-07-01 00:00:00.000000000 Z
11
+ date: 2014-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: elasticsearch
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.4.11
33
+ version: '1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.4.11
40
+ version: '1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: hashie
43
43
  requirement: !ruby/object:Gem::Requirement