Commit af170b19c2e7c6e91c7277e646c25b29408bd822
1 parent
df81e3c3
Exists in
master
and in
21 other branches
Much better organization
Showing
6 changed files
with
82 additions
and
83 deletions
Show diff stats
lib/searchkick.rb
@@ -3,10 +3,8 @@ require "elasticsearch" | @@ -3,10 +3,8 @@ require "elasticsearch" | ||
3 | require "hashie" | 3 | require "hashie" |
4 | require "searchkick/version" | 4 | require "searchkick/version" |
5 | require "searchkick/index" | 5 | require "searchkick/index" |
6 | -require "searchkick/reindex" | ||
7 | require "searchkick/results" | 6 | require "searchkick/results" |
8 | require "searchkick/query" | 7 | require "searchkick/query" |
9 | -require "searchkick/similar" | ||
10 | require "searchkick/reindex_job" | 8 | require "searchkick/reindex_job" |
11 | require "searchkick/model" | 9 | require "searchkick/model" |
12 | require "searchkick/tasks" | 10 | require "searchkick/tasks" |
@@ -30,11 +28,13 @@ module Searchkick | @@ -30,11 +28,13 @@ module Searchkick | ||
30 | attr_accessor :search_method_name | 28 | attr_accessor :search_method_name |
31 | attr_accessor :wordnet_path | 29 | attr_accessor :wordnet_path |
32 | attr_accessor :timeout | 30 | attr_accessor :timeout |
31 | + attr_accessor :models | ||
33 | end | 32 | end |
34 | self.callbacks = true | 33 | self.callbacks = true |
35 | self.search_method_name = :search | 34 | self.search_method_name = :search |
36 | self.wordnet_path = "/var/lib/wn_s.pl" | 35 | self.wordnet_path = "/var/lib/wn_s.pl" |
37 | self.timeout = 10 | 36 | self.timeout = 10 |
37 | + self.models = [] | ||
38 | 38 | ||
39 | def self.client | 39 | def self.client |
40 | @client ||= | 40 | @client ||= |
lib/searchkick/index.rb
@@ -27,6 +27,34 @@ module Searchkick | @@ -27,6 +27,34 @@ module Searchkick | ||
27 | client.indices.exists_alias name: name | 27 | client.indices.exists_alias name: name |
28 | end | 28 | end |
29 | 29 | ||
30 | + def search_model(searchkick_klass, term = nil, options = {}, &block) | ||
31 | + query = Searchkick::Query.new(searchkick_klass, term, options) | ||
32 | + if block | ||
33 | + block.call(query.body) | ||
34 | + end | ||
35 | + if options[:execute] == false | ||
36 | + query | ||
37 | + else | ||
38 | + query.execute | ||
39 | + end | ||
40 | + end | ||
41 | + | ||
42 | + def similar_record(record, options = {}) | ||
43 | + like_text = retrieve(record).to_hash | ||
44 | + .keep_if{|k,v| !options[:fields] || options[:fields].map(&:to_s).include?(k) } | ||
45 | + .values.compact.join(" ") | ||
46 | + | ||
47 | + # TODO deep merge method | ||
48 | + options[:where] ||= {} | ||
49 | + options[:where][:_id] ||= {} | ||
50 | + options[:where][:_id][:not] = record.id.to_s | ||
51 | + options[:limit] ||= 10 | ||
52 | + options[:similar] = true | ||
53 | + | ||
54 | + # TODO use index class instead of record class | ||
55 | + search_model(record.class, like_text, options) | ||
56 | + end | ||
57 | + | ||
30 | def swap(new_name) | 58 | def swap(new_name) |
31 | old_indices = | 59 | old_indices = |
32 | begin | 60 | begin |
lib/searchkick/model.rb
@@ -4,6 +4,8 @@ module Searchkick | @@ -4,6 +4,8 @@ module Searchkick | ||
4 | def searchkick(options = {}) | 4 | def searchkick(options = {}) |
5 | raise "Only call searchkick once per model" if respond_to?(:searchkick_index) | 5 | raise "Only call searchkick once per model" if respond_to?(:searchkick_index) |
6 | 6 | ||
7 | + Searchkick.models << self | ||
8 | + | ||
7 | class_eval do | 9 | class_eval do |
8 | cattr_reader :searchkick_options, :searchkick_klass | 10 | cattr_reader :searchkick_options, :searchkick_klass |
9 | 11 | ||
@@ -14,28 +16,50 @@ module Searchkick | @@ -14,28 +16,50 @@ module Searchkick | ||
14 | class_variable_set :@@searchkick_callbacks, callbacks | 16 | class_variable_set :@@searchkick_callbacks, callbacks |
15 | class_variable_set :@@searchkick_index, options[:index_name] || [options[:index_prefix], model_name.plural, Searchkick.env].compact.join("_") | 17 | class_variable_set :@@searchkick_index, options[:index_name] || [options[:index_prefix], model_name.plural, Searchkick.env].compact.join("_") |
16 | 18 | ||
17 | - def self.searchkick_index | ||
18 | - index = class_variable_get :@@searchkick_index | ||
19 | - index = index.call if index.respond_to? :call | ||
20 | - Searchkick::Index.new(index, class_variable_get(:@@searchkick_options)) | 19 | + define_singleton_method(Searchkick.search_method_name) do |term = nil, options={}, &block| |
20 | + searchkick_index.search_model(self, term, options, &block) | ||
21 | end | 21 | end |
22 | 22 | ||
23 | - define_singleton_method(Searchkick.search_method_name) do |term = nil, options={}, &block| | ||
24 | - query = Searchkick::Query.new(self, term, options) | ||
25 | - if block | ||
26 | - block.call(query.body) | 23 | + class << self |
24 | + | ||
25 | + def searchkick_index | ||
26 | + index = class_variable_get :@@searchkick_index | ||
27 | + index = index.call if index.respond_to? :call | ||
28 | + Searchkick::Index.new(index, class_variable_get(:@@searchkick_options)) | ||
27 | end | 29 | end |
28 | - if options[:execute] == false | ||
29 | - query | ||
30 | - else | ||
31 | - query.execute | 30 | + |
31 | + def enable_search_callbacks | ||
32 | + class_variable_set :@@searchkick_callbacks, true | ||
33 | + end | ||
34 | + | ||
35 | + def disable_search_callbacks | ||
36 | + class_variable_set :@@searchkick_callbacks, false | ||
37 | + end | ||
38 | + | ||
39 | + def search_callbacks? | ||
40 | + class_variable_get(:@@searchkick_callbacks) && Searchkick.callbacks? | ||
41 | + end | ||
42 | + | ||
43 | + def reindex(options = {}) | ||
44 | + searchkick_index.reindex_scope(searchkick_klass, options) | ||
45 | + end | ||
46 | + | ||
47 | + def clean_indices | ||
48 | + searchkick_index.clean_indices | ||
49 | + end | ||
50 | + | ||
51 | + def searchkick_import(options = {}) | ||
52 | + (options[:index] || searchkick_index).import_scope(searchkick_klass) | ||
53 | + end | ||
54 | + | ||
55 | + def searchkick_create_index | ||
56 | + searchkick_index.create_index | ||
57 | + end | ||
58 | + | ||
59 | + def searchkick_index_options | ||
60 | + searchkick_index.index_options | ||
32 | end | 61 | end |
33 | - end | ||
34 | - extend Searchkick::Reindex | ||
35 | - include Searchkick::Similar | ||
36 | 62 | ||
37 | - def reindex_async | ||
38 | - self.class.searchkick_index.reindex_record_async(self) | ||
39 | end | 63 | end |
40 | 64 | ||
41 | if callbacks | 65 | if callbacks |
@@ -48,30 +72,26 @@ module Searchkick | @@ -48,30 +72,26 @@ module Searchkick | ||
48 | end | 72 | end |
49 | end | 73 | end |
50 | 74 | ||
51 | - def self.enable_search_callbacks | ||
52 | - class_variable_set :@@searchkick_callbacks, true | ||
53 | - end | ||
54 | - | ||
55 | - def self.disable_search_callbacks | ||
56 | - class_variable_set :@@searchkick_callbacks, false | ||
57 | - end | ||
58 | - | ||
59 | - def self.search_callbacks? | ||
60 | - class_variable_get(:@@searchkick_callbacks) && Searchkick.callbacks? | 75 | + def reindex |
76 | + self.class.searchkick_index.reindex_record(self) | ||
61 | end | 77 | end |
62 | 78 | ||
63 | - def should_index? | ||
64 | - true | 79 | + def reindex_async |
80 | + self.class.searchkick_index.reindex_record_async(self) | ||
65 | end | 81 | end |
66 | 82 | ||
67 | - def reindex | ||
68 | - self.class.searchkick_index.reindex_record(self) | 83 | + def similar(options = {}) |
84 | + self.class.searchkick_index.similar_record(self, options) | ||
69 | end | 85 | end |
70 | 86 | ||
71 | def search_data | 87 | def search_data |
72 | respond_to?(:to_hash) ? to_hash : serializable_hash | 88 | respond_to?(:to_hash) ? to_hash : serializable_hash |
73 | end | 89 | end |
74 | 90 | ||
91 | + def should_index? | ||
92 | + true | ||
93 | + end | ||
94 | + | ||
75 | end | 95 | end |
76 | end | 96 | end |
77 | 97 |
lib/searchkick/reindex.rb
@@ -1,30 +0,0 @@ | @@ -1,30 +0,0 @@ | ||
1 | -module Searchkick | ||
2 | - module Reindex | ||
3 | - | ||
4 | - def self.extended(klass) | ||
5 | - @descendents ||= [] | ||
6 | - @descendents << klass unless @descendents.include?(klass) | ||
7 | - end | ||
8 | - | ||
9 | - def reindex(options = {}) | ||
10 | - searchkick_index.reindex_scope(searchkick_klass, options) | ||
11 | - end | ||
12 | - | ||
13 | - def clean_indices | ||
14 | - searchkick_index.clean_indices | ||
15 | - end | ||
16 | - | ||
17 | - def searchkick_import(options = {}) | ||
18 | - (options[:index] || searchkick_index).import_scope(searchkick_klass) | ||
19 | - end | ||
20 | - | ||
21 | - def searchkick_create_index | ||
22 | - searchkick_index.create_index | ||
23 | - end | ||
24 | - | ||
25 | - def searchkick_index_options | ||
26 | - searchkick_index.index_options | ||
27 | - end | ||
28 | - | ||
29 | - end | ||
30 | -end |
lib/searchkick/similar.rb
@@ -1,19 +0,0 @@ | @@ -1,19 +0,0 @@ | ||
1 | -module Searchkick | ||
2 | - module Similar | ||
3 | - | ||
4 | - def similar(options = {}) | ||
5 | - like_text = self.class.searchkick_index.retrieve(self).to_hash | ||
6 | - .keep_if{|k,v| !options[:fields] || options[:fields].map(&:to_s).include?(k) } | ||
7 | - .values.compact.join(" ") | ||
8 | - | ||
9 | - # TODO deep merge method | ||
10 | - options[:where] ||= {} | ||
11 | - options[:where][:_id] ||= {} | ||
12 | - options[:where][:_id][:not] = id.to_s | ||
13 | - options[:limit] ||= 10 | ||
14 | - options[:similar] = true | ||
15 | - self.class.send(Searchkick.search_method_name, like_text, options) | ||
16 | - end | ||
17 | - | ||
18 | - end | ||
19 | -end |
lib/searchkick/tasks.rb
@@ -22,7 +22,7 @@ namespace :searchkick do | @@ -22,7 +22,7 @@ namespace :searchkick do | ||
22 | desc "reindex all models" | 22 | desc "reindex all models" |
23 | task :all => :environment do | 23 | task :all => :environment do |
24 | Rails.application.eager_load! | 24 | Rails.application.eager_load! |
25 | - (Searchkick::Reindex.instance_variable_get(:@descendents) || []).each do |model| | 25 | + Searchkick.models.each do |model| |
26 | puts "Reindexing #{model.name}..." | 26 | puts "Reindexing #{model.name}..." |
27 | model.reindex | 27 | model.reindex |
28 | end | 28 | end |