【问题标题】:Searchkick + ElasticSearch in Production: Faraday::ConnectionFailed: Connection refused - connect(2)生产中的 Searchkick + ElasticSearch:Faraday::ConnectionFailed:连接被拒绝 - 连接(2)
【发布时间】:2016-10-04 15:03:37
【问题描述】:

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

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

在我的 Gemfile 中添加:

gem 'elasticsearch-model'
gem 'elasticsearch-rails'
gem 'searchkick'

在我的 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

models/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

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

Product.search("foobar") #before run: rails c production 

显示下一条消息:Faraday::ConnectionFailed: Connection denied - connect(2)

然后我试试这个

rake searchkick:reindex:all RAILS_ENV=production

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

【问题讨论】:

    标签: ruby ruby-on-rails-4 elasticsearch amazon-ec2 searchkick


    【解决方案1】:

    写完这篇文章后,我读到:Searchkick with ElasticSearch returns "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
    

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

      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} })
    

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

    【讨论】:

    • 仅供参考,您已清楚地保留了连接详细信息,并且您的安全组似乎允许来自世界任何地方的连接。
    【解决方案2】:

    我找到了上面的答案,让我完成了 95% 的工作。我按照 Nelson 的建议创建了一个 Elasticsearch 初始化程序,它消除了 Faraday::ConnectionFailed (Connection refused - connect(2) for "localhost" port 9200): 但是我仍然需要重新索引并迁移我的 Heroku DB。

    heroku run rake searchkick:reindex CLASS=YOUR CLASS NAME
    

    然后heroku run rake db:migrate

    希望能澄清像我这样卡在最后一部分的 Heroku 新手。

    【讨论】:

      【解决方案3】:

      如果您使用gem 'searchkick',只需在/config/initializers/elasticsearch.rb 中添加以下行

      ENV["ELASTICSEARCH_URL"] = "http://myelasticsearch-xyz-foobar.amazonaws.com:port"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        • 2019-06-15
        • 2017-07-20
        相关资源
        最近更新 更多