Как подключить searchkick (в приложении Rails

#searchkick

#searchkick

Вопрос:

При запуске мое приложение устанавливает мой (? глобальный?) Клиент searchkick так, чтобы он указывал на мой кластер elasticsearch по умолчанию.

  Searchkick.client = Elasticsearch::Client.new(
   hosts:            default_cluster, # this is the list of hosts in my default cluster
   retry_on_failure: true,
 )
  

Тем не менее, я обновляю свой кластер (снова), и хотя я хотел бы, чтобы мое приложение могло читать / искать из этого кластера по умолчанию,

 /search?q="some term"
# => 
Model.search("some term")
  

продолжайте работать с default_cluster

Где это начинает становиться немного сложнее, так это:

  1. Я бы также хотел (через какие-то конкретные фоновые задания sidekiq?) чтобы заполнить индекс альтернативного (альтернативного) кластера, что-то вроде:
 Model.connect_to(alternate_cluster) {|client|
  Searchkick.client = client
  Model.reindex
}
  

Не заставляя все другие фоновые задания взаимодействовать с альтернативным кластером.

И, конечно:

  1. Я хотел бы каким-то образом проверить, что alternate_cluster работает хорошо (т. Е. Для поиска), прежде чем сделать его моим default_cluster . И, предположительно, через какой-либо маршрут администратора:
 /admin/search?q="some search term"amp;cluster=alternate

# =>
Model.connect_to(alternate_cluster) {|client|
  Searchkick.client = client
  Model.search("some term")
}

  

И, наконец,:

  1. Я бы хотел избежать необходимости повторного подключения перед каждым действием поиска / переиндексации, т. Е. Я бы предпочел не иметь накладных расходов на изменение (также потому, что это, вероятно, подразумевает, что длительные задачи, которые продолжают повторно подключаться к searchkick, будут переключаться с одного кластера на другой):
 Model.search("some term")

# =>

Model.connect_to(alternate_cluster) {|client|
  Searchkick.client = client

Model.search("some term")
}

  

^ Я этого не хочу

FWIW, лучшее, что я смог придумать до сих пор, это что-то вроде:

 def self.connect_to(current_cluster, amp;block)
  previous_es_client = Searchkick.client

  current_es_client = Elasticsearch::Client.new(
   hosts:            current_cluster,
   retry_on_failure: true,
  )

  block.call(current_es_client)

  rescue Exception => e
    logger.warn(e)
  ensure
    Searchkick.client = previous_es_client
end
  

Но я подозреваю, что это приведет к тому, что любое другое взаимодействие в моей системе (через тот же веб-рабочий или другие фоновые задания, выполняемые в том же экземпляре background-worker) (временно) укажет на альтернативный кластер.

Заранее спасибо за вашу помощь…