diff --git a/lib/searchkick.rb b/lib/searchkick.rb index d1f35c3..48c6f42 100644 --- a/lib/searchkick.rb +++ b/lib/searchkick.rb @@ -1,14 +1,21 @@ -require "tire" +require "elasticsearch" require "searchkick/version" +require "searchkick/index" require "searchkick/reindex" require "searchkick/results" require "searchkick/search" require "searchkick/similar" require "searchkick/model" require "searchkick/tasks" -require "searchkick/logger" if defined?(Rails) +# TODO add logger +# require "searchkick/logger" if defined?(Rails) module Searchkick + + def self.client + @client ||= Elasticsearch::Client.new log: true + end + @callbacks = true def self.enable_callbacks @@ -24,6 +31,8 @@ module Searchkick end end +require "active_record" # TODO remove + # TODO find better ActiveModel hook -ActiveModel::Callbacks.send(:include, Searchkick::Model) +ActiveModel::Callbacks.send(:include, Searchkick::Model) if defined?(ActiveModel) ActiveRecord::Base.send(:extend, Searchkick::Model) if defined?(ActiveRecord) diff --git a/lib/searchkick/index.rb b/lib/searchkick/index.rb new file mode 100644 index 0000000..6031999 --- /dev/null +++ b/lib/searchkick/index.rb @@ -0,0 +1,32 @@ +module Searchkick + class Index + attr_reader :name + + def initialize(name) + @name = name + end + + def create(options = {}) + Searchkick.client.indices.create index: name, body: options + end + + def delete + Searchkick.client.indices.delete index: name + end + + def exists? + Searchkick.client.indices.exists index: name + end + + def refresh + Searchkick.client.indices.refresh index: name + end + + def store(model) + end + + def remove(model) + end + + end +end diff --git a/lib/searchkick/model.rb b/lib/searchkick/model.rb index 57ec70b..be611b4 100644 --- a/lib/searchkick/model.rb +++ b/lib/searchkick/model.rb @@ -13,7 +13,7 @@ module Searchkick # set index name # TODO support proc index_name = options[:index_name] || [options[:index_prefix], model_name.plural, searchkick_env].compact.join("_") - class_variable_set :@@searchkick_index, Tire::Index.new(index_name) + class_variable_set :@@searchkick_index, Searchkick::Index.new(index_name) extend Searchkick::Search extend Searchkick::Reindex diff --git a/lib/searchkick/reindex.rb b/lib/searchkick/reindex.rb index 2ec3047..6e33190 100644 --- a/lib/searchkick/reindex.rb +++ b/lib/searchkick/reindex.rb @@ -2,36 +2,29 @@ module Searchkick module Reindex # https://gist.github.com/jarosan/3124884 + # http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/ def reindex alias_name = searchkick_index.name new_index = alias_name + "_" + Time.now.strftime("%Y%m%d%H%M%S%L") - index = Tire::Index.new(new_index) + index = Searchkick::Index.new(new_index) clean_indices success = index.create searchkick_index_options raise index.response.to_s if !success - if a = Tire::Alias.find(alias_name) + # check if alias exists + if Searchkick.client.indices.exists_alias name: alias_name searchkick_import(index) # import before swap - a.indices.each do |i| - a.indices.delete i - end - - a.indices.add new_index - response = a.save - - if response.success? - clean_indices - else - raise response.to_s - end + # get existing indices to remove + old_indices = Searchkick.client.indices.get_alias(name: alias_name).keys + actions = old_indices.map{|name| {remove: {index: name, alias: alias_name}} } + [{add: {index: new_index, alias: alias_name}}] + Searchkick.client.indices.update_aliases body: {actions: actions} + clean_indices else searchkick_index.delete if searchkick_index.exists? - response = Tire::Alias.create(name: alias_name, indices: [new_index]) - raise response.to_s if !response.success? - + Searchkick.client.indices.update_aliases body: {actions: [{add: {index: new_index, alias: alias_name}}]} searchkick_import(index) # import after swap end @@ -42,10 +35,10 @@ module Searchkick # remove old indices that start w/ index_name def clean_indices - all_indices = JSON.parse(Tire::Configuration.client.get("#{Tire::Configuration.url}/_aliases").body) + all_indices = Searchkick.client.indices.get_aliases indices = all_indices.select{|k, v| v["aliases"].empty? && k =~ /\A#{Regexp.escape(searchkick_index.name)}_\d{14,17}\z/ }.keys indices.each do |index| - Tire::Index.new(index).delete + Searchkick::Index.new(index).delete end indices end diff --git a/lib/searchkick/results.rb b/lib/searchkick/results.rb index fdaca24..2882937 100644 --- a/lib/searchkick/results.rb +++ b/lib/searchkick/results.rb @@ -1,5 +1,5 @@ module Searchkick - class Results < Tire::Results::Collection + class Results def suggestions if @response["suggest"] diff --git a/lib/searchkick/search.rb b/lib/searchkick/search.rb index 6a73e72..68aafa4 100644 --- a/lib/searchkick/search.rb +++ b/lib/searchkick/search.rb @@ -328,10 +328,9 @@ module Searchkick tire_options = {load: load, payload: payload, size: per_page, from: offset} tire_options[:type] = document_type if self != searchkick_klass - search = Tire::Search::Search.new(index_name, tire_options) begin - response = search.json - rescue Tire::Search::SearchRequestFailed => e + response = Searchkick.client.search index: index_name, body: payload + rescue => e status_code = e.message[0..3].to_i if status_code == 404 raise "Index missing - run #{searchkick_klass.name}.reindex" diff --git a/searchkick.gemspec b/searchkick.gemspec index 0e60113..9aa1e73 100644 --- a/searchkick.gemspec +++ b/searchkick.gemspec @@ -18,8 +18,7 @@ Gem::Specification.new do |spec| spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"] - spec.add_dependency "tire" - spec.add_dependency "tire-contrib" + spec.add_dependency "elasticsearch" spec.add_development_dependency "bundler", "~> 1.3" spec.add_development_dependency "rake" diff --git a/test/index_test.rb b/test/index_test.rb index a796594..fc3b8f5 100644 --- a/test/index_test.rb +++ b/test/index_test.rb @@ -3,8 +3,8 @@ require_relative "test_helper" class TestIndex < Minitest::Unit::TestCase def test_clean_indices - old_index = Tire::Index.new("products_test_20130801000000000") - different_index = Tire::Index.new("items_test_20130801000000000") + old_index = Searchkick::Index.new("products_test_20130801000000000") + different_index = Searchkick::Index.new("items_test_20130801000000000") # create indexes old_index.create @@ -18,7 +18,7 @@ class TestIndex < Minitest::Unit::TestCase end def test_clean_indices_old_format - old_index = Tire::Index.new("products_test_20130801000000") + old_index = Searchkick::Index.new("products_test_20130801000000") old_index.create Product.clean_indices diff --git a/test/test_helper.rb b/test/test_helper.rb index a547764..2a5b7fc 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -6,10 +6,7 @@ require "minitest/pride" ENV["RACK_ENV"] = "test" File.delete("elasticsearch.log") if File.exists?("elasticsearch.log") -Tire.configure do - logger "elasticsearch.log", :level => "debug" - pretty true -end +Searchkick.client.transport.logger = Logger.new("elasticsearch.log") if defined?(Mongoid) Mongoid.configure do |config| -- libgit2 0.21.0