diff --git a/CHANGELOG.md b/CHANGELOG.md index 782723f..7fa9e23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.0 + +- Added support for Elasticsearch 1.2 + ## 0.7.9 - Added `tokens` method diff --git a/README.md b/README.md index dbee84e..85a3e8f 100644 --- a/README.md +++ b/README.md @@ -45,12 +45,6 @@ Add this line to your application’s Gemfile: gem 'searchkick' ``` -For Elasticsearch 1.2, use: - -```ruby -gem 'searchkick', github: 'ankane/searchkick', branch: 'elasticsearch-1.2' -``` - For Elasticsearch 0.90, use version `0.6.3` and [this readme](https://github.com/ankane/searchkick/blob/v0.6.3/README.md). Add searchkick to models you want to search. diff --git a/lib/searchkick.rb b/lib/searchkick.rb index ca75671..56a5255 100644 --- a/lib/searchkick.rb +++ b/lib/searchkick.rb @@ -25,6 +25,10 @@ module Searchkick @client = client end + def self.server_version + @server_version ||= client.info["version"]["number"] + end + @callbacks = true def self.enable_callbacks diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index 0141ab2..049b0e7 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -15,6 +15,8 @@ module Searchkick @term = term @options = options + below12 = Gem::Version.new(Searchkick.server_version) < Gem::Version.new("1.2") + boost_fields = {} fields = if options[:fields] @@ -127,6 +129,13 @@ module Searchkick if conversions_field and options[:conversions] != false # wrap payload in a bool query + script_score = + if below12 + {script_score: {script: "doc['count'].value"}} + else + {field_value_factor: {field: "count"}} + end + payload = { bool: { must: payload, @@ -141,11 +150,8 @@ module Searchkick match: { query: term } - }, - script_score: { - script: "doc['count'].value" } - } + }.merge(script_score) } } } @@ -165,16 +171,20 @@ module Searchkick end boost_by.each do |field, value| + script_score = + if below12 + {script_score: {script: "#{value[:factor].to_f} * log(doc['#{field}'].value + 2.718281828)"}} + else + {field_value_factor: {field: field, factor: value[:factor].to_f, modifier: "ln2p"}} + end + custom_filters << { filter: { exists: { field: field } - }, - script_score: { - script: "#{value[:factor].to_f} * log(doc['#{field}'].value + 2.718281828)" } - } + }.merge(script_score) end boost_where = options[:boost_where] || {} @@ -370,7 +380,7 @@ module Searchkick e.message.include?("No query registered for [function_score]]") ) - raise UnsupportedVersionError, "This version of Searchkick requires Elasticsearch 0.90.4 or greater" + raise UnsupportedVersionError, "This version of Searchkick requires Elasticsearch 1.0 or greater" elsif status_code == 400 if e.message.include?("[multi_match] analyzer [searchkick_search] not found") raise InvalidQueryError, "Bad mapping - run #{searchkick_klass.name}.reindex" diff --git a/searchkick.gemspec b/searchkick.gemspec index e1e2b6d..5785978 100644 --- a/searchkick.gemspec +++ b/searchkick.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency "activemodel" - spec.add_dependency "elasticsearch", "~> 0.4.11" + spec.add_dependency "elasticsearch", ">= 1" spec.add_dependency "hashie" spec.add_development_dependency "bundler", "~> 1.3" -- libgit2 0.21.0