生产中的 Searchkick + ElasticSearch:Faraday::ConnectionFailed:连接被拒绝 - connect(2)

Nel*_*nez 2 ruby amazon-ec2 elasticsearch ruby-on-rails-4 searchkick

我有一个使用 ElasticSearch 进行生产的应用程序。(它有效)但现在我可以添加 searchkick gem 而不是只使用 elasticsearch。

为此,我添加了以下内容:

在我的Gemfile 中添加:

gem 'elasticsearch-model'
gem 'elasticsearch-rails'
gem 'searchkick'
Run Code Online (Sandbox Code Playgroud)

在我的config/initializers/elasticsearch.rb(我使用 Amazon Elasticsearch Service 进行生产。好的,我知道这是不好的做法,但我会为环境变量更改此设置)

if Rails.env == "production"
    Elasticsearch::Model.client = Elasticsearch::Client.new url: 'https://xxxxxxxx.xxxxxxx.amazonaws.com/'

else
    Elasticsearch::Model.client = Elasticsearch::Client.new url: 'http://localhost:9200/'
end
Run Code Online (Sandbox Code Playgroud)

模型/product.rb

require 'elasticsearch/model'

class Product < ActiveRecord::Base
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks
  searchkick
  #currently use this function for search. (It works)
  scope :searching, ->(query) { __elasticsearch__.search(query).records }
end
Run Code Online (Sandbox Code Playgroud)

但是现在当我尝试在服务器中使用时:

Product.search("foobar") #before run: rails c production 
Run Code Online (Sandbox Code Playgroud)

显示下一条消息:Faraday::ConnectionFailed:连接被拒绝 - connect(2)

之后我试试这个

rake searchkick:reindex:all RAILS_ENV=production
Run Code Online (Sandbox Code Playgroud)

我收到了同样的信息。对此有什么想法吗?

Nel*_*nez 5

写完这篇文章后,我读到了:带有 ElasticSearch 的 Searchkick 返回“Faraday::ConnectionFailed: execution expired”

config/initializers/elasticsearch.rb

if Rails.env == "production"
  url = 'http://myelasticsearch-xyz-foobar.amazonaws.com'
    Elasticsearch::Model.client = Elasticsearch::Client.new url: url
  Searchkick.client = Elasticsearch::Client.new(hosts: url, retry_on_failure: true, transport_options: {request: {timeout: 250}})
else
  url = 'http://localhost:9200/'
    Elasticsearch::Model.client = Elasticsearch::Client.new url: url
  Searchkick.client = Elasticsearch::Client.new(hosts: url, retry_on_failure: true, transport_options: {request: {timeout: 250}})
end
Run Code Online (Sandbox Code Playgroud)

重构并清理这段代码后,我得到了这个:

  Elasticsearch::Model.client = Elasticsearch::Client.new url: env['RAILS_ENV']
  Searchkick.client = Elasticsearch::Client.new(hosts: env['RAILS_ENV'], retry_on_failure: true, transport_options: {request: {timeout: 250} })
Run Code Online (Sandbox Code Playgroud)

我希望这个解释对其他人有用

  • 仅供参考,您已将连接详细信息保持清晰,您的安全组似乎允许来自世界任何地方的连接。 (2认同)