searchkick 0.7.9 → 0.8.0

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
  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