Module: Searchkick

Defined in:
lib/searchkick.rb,
lib/searchkick/index.rb,
lib/searchkick/model.rb,
lib/searchkick/query.rb,
lib/searchkick/indexer.rb,
lib/searchkick/logging.rb,
lib/searchkick/results.rb,
lib/searchkick/version.rb,
lib/searchkick/middleware.rb,
lib/searchkick/record_data.rb,
lib/searchkick/bulk_indexer.rb,
lib/searchkick/hash_wrapper.rb,
lib/searchkick/multi_search.rb,
lib/searchkick/index_options.rb,
lib/searchkick/reindex_queue.rb,
lib/searchkick/record_indexer.rb,
lib/searchkick/reindex_v2_job.rb,
lib/searchkick/bulk_reindex_job.rb,
lib/searchkick/process_batch_job.rb,
lib/searchkick/process_queue_job.rb

Defined Under Namespace

Modules: ControllerRuntime, IndexOptions, IndexWithInstrumentation, IndexerWithInstrumentation, Model, QueryWithInstrumentation, SearchkickWithInstrumentation Classes: BulkIndexer, BulkReindexJob, DangerousOperation, Error, HashWrapper, ImportError, Index, Indexer, InvalidQueryError, LogSubscriber, Middleware, MissingIndexError, MultiSearch, ProcessBatchJob, ProcessQueueJob, Query, RecordData, RecordIndexer, ReindexQueue, ReindexV2Job, Results, UnsupportedVersionError

Constant Summary collapse

VERSION =
"3.1.1"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.aws_credentialsObject

Returns the value of attribute aws_credentials.



53
54
55
# File 'lib/searchkick.rb', line 53

def aws_credentials
  @aws_credentials
end

.clientObject



63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/searchkick.rb', line 63

def self.client
  @client ||= begin
    require "typhoeus/adapters/faraday" if defined?(Typhoeus)

    Elasticsearch::Client.new({
      url: ENV["ELASTICSEARCH_URL"],
      transport_options: {request: {timeout: timeout}, headers: {content_type: "application/json"}},
      retry_on_failure: 2
    }.deep_merge(client_options)) do |f|
      f.use Searchkick::Middleware
      f.request signer_middleware_key, signer_middleware_aws_params if aws_credentials
    end
  end
end

.client_optionsObject

Returns the value of attribute client_options.



51
52
53
# File 'lib/searchkick.rb', line 51

def client_options
  @client_options
end

.envObject



78
79
80
# File 'lib/searchkick.rb', line 78

def self.env
  @env ||= ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
end

.index_prefixObject

Returns the value of attribute index_prefix.



51
52
53
# File 'lib/searchkick.rb', line 51

def index_prefix
  @index_prefix
end

.index_suffixObject

Returns the value of attribute index_suffix.



51
52
53
# File 'lib/searchkick.rb', line 51

def index_suffix
  @index_suffix
end

.model_optionsObject

Returns the value of attribute model_options.



51
52
53
# File 'lib/searchkick.rb', line 51

def model_options
  @model_options
end

.modelsObject

Returns the value of attribute models.



51
52
53
# File 'lib/searchkick.rb', line 51

def models
  @models
end

.queue_nameObject

Returns the value of attribute queue_name.



51
52
53
# File 'lib/searchkick.rb', line 51

def queue_name
  @queue_name
end

.redisObject

Returns the value of attribute redis.



51
52
53
# File 'lib/searchkick.rb', line 51

def redis
  @redis
end

.search_method_nameObject

Returns the value of attribute search_method_name.



51
52
53
# File 'lib/searchkick.rb', line 51

def search_method_name
  @search_method_name
end

.search_timeoutObject



82
83
84
# File 'lib/searchkick.rb', line 82

def self.search_timeout
  @search_timeout || timeout
end

.timeoutObject

Returns the value of attribute timeout.



51
52
53
# File 'lib/searchkick.rb', line 51

def timeout
  @timeout
end

.wordnet_pathObject

Returns the value of attribute wordnet_path.



51
52
53
# File 'lib/searchkick.rb', line 51

def wordnet_path
  @wordnet_path
end

Class Method Details

.callbacks(value) ⇒ Object



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/searchkick.rb', line 138

def self.callbacks(value)
  if block_given?
    previous_value = callbacks_value
    begin
      self.callbacks_value = value
      result = yield
      indexer.perform if callbacks_value == :bulk
      result
    ensure
      self.callbacks_value = previous_value
    end
  else
    self.callbacks_value = value
  end
end

.callbacks?(default: true) ⇒ Boolean

Returns:

  • (Boolean)


130
131
132
133
134
135
136
# File 'lib/searchkick.rb', line 130

def self.callbacks?(default: true)
  if callbacks_value.nil?
    default
  else
    callbacks_value != false
  end
end

.callbacks_valueObject

private



215
216
217
# File 'lib/searchkick.rb', line 215

def self.callbacks_value
  Thread.current[:searchkick_callbacks_enabled]
end

.callbacks_value=(value) ⇒ Object

private



220
221
222
# File 'lib/searchkick.rb', line 220

def self.callbacks_value=(value)
  Thread.current[:searchkick_callbacks_enabled] = value
end

.disable_callbacksObject



126
127
128
# File 'lib/searchkick.rb', line 126

def self.disable_callbacks
  self.callbacks_value = false
end

.enable_callbacksObject

callbacks



122
123
124
# File 'lib/searchkick.rb', line 122

def self.enable_callbacks
  self.callbacks_value = nil
end

.indexerObject

private



210
211
212
# File 'lib/searchkick.rb', line 210

def self.indexer
  Thread.current[:searchkick_indexer] ||= Searchkick::Indexer.new
end

.load_records(records, ids) ⇒ Object

private

Raises:



189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/searchkick.rb', line 189

def self.load_records(records, ids)
  records =
    if records.respond_to?(:primary_key)
      # ActiveRecord
      records.where(records.primary_key => ids) if records.primary_key
    elsif records.respond_to?(:queryable)
      # Mongoid 3+
      records.queryable.for_ids(ids)
    elsif records.respond_to?(:unscoped) && :id.respond_to?(:in)
      # Nobrainer
      records.unscoped.where(:id.in => ids)
    elsif records.respond_to?(:key_column_names)
      records.where(records.key_column_names.first => ids)
    end

  raise Searchkick::Error, "Not sure how to load records" if !records

  records
end

.multi_search(queries) ⇒ Object



116
117
118
# File 'lib/searchkick.rb', line 116

def self.multi_search(queries)
  Searchkick::MultiSearch.new(queries).perform
end

.reindex_status(index_name) ⇒ Object



164
165
166
167
168
169
170
171
172
173
174
# File 'lib/searchkick.rb', line 164

def self.reindex_status(index_name)
  if redis
    batches_left = Searchkick::Index.new(index_name).batches_left
    {
      completed: batches_left == 0,
      batches_left: batches_left
    }
  else
    raise Searchkick::Error, "Redis not configured"
  end
end

.search(term = "*", model: nil, **options, &block) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/searchkick.rb', line 94

def self.search(term = "*", model: nil, **options, &block)
  options = options.dup
  klass = model

  # make Searchkick.search(index_name: [Product]) and Product.search equivalent
  unless klass
    index_name = Array(options[:index_name])
    if index_name.size == 1 && index_name.first.respond_to?(:searchkick_index)
      klass = index_name.first
      options.delete(:index_name)
    end
  end

  query = Searchkick::Query.new(klass, term, options)
  block.call(query.body) if block
  if options[:execute] == false
    query
  else
    query.execute
  end
end

.server_below?(version) ⇒ Boolean

Returns:

  • (Boolean)


90
91
92
# File 'lib/searchkick.rb', line 90

def self.server_below?(version)
  Gem::Version.new(server_version.split("-")[0]) < Gem::Version.new(version.split("-")[0])
end

.server_versionObject



86
87
88
# File 'lib/searchkick.rb', line 86

def self.server_version
  @server_version ||= client.info["version"]["number"]
end

.signer_middleware_aws_paramsObject

private



230
231
232
233
234
235
236
237
238
239
240
# File 'lib/searchkick.rb', line 230

def self.signer_middleware_aws_params
  if signer_middleware_key == :aws_sigv4
    {service: "es", region: "us-east-1"}.merge(aws_credentials)
  else
    {
      credentials: aws_credentials[:credentials] || Aws::Credentials.new(aws_credentials[:access_key_id], aws_credentials[:secret_access_key]),
      service_name: "es",
      region: aws_credentials[:region] || "us-east-1"
    }
  end
end

.signer_middleware_keyObject

private



225
226
227
# File 'lib/searchkick.rb', line 225

def self.signer_middleware_key
  defined?(FaradayMiddleware::AwsSignersV4) ? :aws_signers_v4 : :aws_sigv4
end

.with_redisObject



176
177
178
179
180
181
182
183
184
185
186
# File 'lib/searchkick.rb', line 176

def self.with_redis
  if redis
    if redis.respond_to?(:with)
      redis.with do |r|
        yield r
      end
    else
      yield redis
    end
  end
end