Searchkick + ElasticSearch в продакшене: Faraday::ConnectionFailed: Отказ в подключении — подключение(2)

У меня есть приложение в производстве с ElasticSearch. (Это работает), но теперь я могу добавить гем searchkick вместо использования только elasticsearch.

Для этого я добавил следующее:

В моем 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: Отказ в соединении - соединение(2)

После этого я пробую это

rake searchkick:reindex:all RAILS_ENV=production

И мне пришло такое же сообщение. Любая идея для этого?


person Nelson Patricio Jimenez    schedule 04.06.2016    source источник


Ответы (3)


После того как я закончил писать этот пост, я прочитал это: Faraday::ConnectionFailed: время выполнения истекло

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

Я надеюсь, что это объяснение работает для других

person Nelson Patricio Jimenez    schedule 04.06.2016
comment
К вашему сведению, вы не указали детали подключения, и ваши группы безопасности, по-видимому, разрешают подключения из любой точки мира. - person Frederick Cheung; 06.07.2016

Я нашел приведенный выше ответ, чтобы получить 95% пути туда. Я последовал совету Нельсона и создал инициализатор Elasticsearch, который устранил Faraday::ConnectionFailed (Connection refused - connect(2) for "localhost" port 9200):. Однако мне все равно пришлось переиндексировать и перенести мою БД Heroku.

heroku run rake searchkick:reindex CLASS=YOUR CLASS NAME

затем heroku run rake db:migrate

Надеюсь, это прояснит ситуацию для новичков в Heroku, таких как я, которые застряли на последней части.

person tfantina    schedule 03.07.2016

Если вы используете gem 'searchkick', просто добавьте строку ниже в /config/initializers/elasticsearch.rb

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