使用 ElasticSearch 的 Searchkick 返回“Faraday::ConnectionFailed: execution expired”

Posted

技术标签:

【中文标题】使用 ElasticSearch 的 Searchkick 返回“Faraday::ConnectionFailed: execution expired”【英文标题】:Searchkick with ElasticSearch returns "Faraday::ConnectionFailed: execution expired" 【发布时间】:2016-02-07 13:09:55 【问题描述】:

我一直在使用带有 elasticsearch 的 searchkick gem,在 Rails 4.2.0 应用程序上没有问题。我有一个使用 searchkick 的视频模型。

由于某种原因,rake searchkick:reindex:all 现在一直在失败:

重新索引视频... rake 中止! Faraday::ConnectionFailed: 执行 过期了

我最初通过brew install elasticsearch安装elasticsearch,返回:

警告:elasticsearch-1.3.4 已经安装

我的 elasticsearch 安装/数据库是否可能已损坏?如果是这样,刷新它的最佳方法是什么?

按照https://www.elastic.co/guide/en/elasticsearch/reference/1.4/indices-delete-index.html,我尝试了curl -XDELETE 'http://localhost:9200/_all',但这并不能解决错误。

当我将此代码部署到 AWS 时,我的 Mac 和 Elastic Beanstalk 上都会出现此问题(之前两者都正常工作)。

【问题讨论】:

【参考方案1】:

通常经过数小时的努力,我在发布问题几分钟后找到了答案...

根据https://github.com/ankane/searchkick/issues/382,我添加了一个初始化器:

Searchkick.client = Elasticsearch::Client.new(hosts: ["localhost:9200"], retry_on_failure: true, transport_options: request: timeout: 250)

这似乎解决了这个问题。如果再次发生,我会报告。

【讨论】:

【参考方案2】:

在 config/initializers/elasticsearch.rb 中添加以下代码行

Searchkick.client = Elasticsearch::Client.new(hosts: ["localhost:9200"], retry_on_failure: true, transport_options: request: timeout: 250)

可以根据 Rails 环境指定。

【讨论】:

谢谢 - 但我认为这基本上就是我在 2015 年发布的内容?【参考方案3】:

对我来说,问题在于 URL 中缺少端口。 (我使用的是 AWS elasticsearch,而不是在本地主机上运行它。)

我变了

ENV['ELASTICSEARCH_URL'] = Rails.application.credentials.dig(:elasticsearch, :url)

ENV['ELASTICSEARCH_URL'] = Rails.application.credentials.dig(:elasticsearch, :url) + ':443'

这不会影响我所有的项目,所以我猜这与更新的版本有关。

【讨论】:

以上是关于使用 ElasticSearch 的 Searchkick 返回“Faraday::ConnectionFailed: execution expired”的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch中URI Search和RequestBody Search分析

Elasticsearch中URI Search和RequestBody Search分析

elastic search使用总结

elasticsearch之七search搜索详解

Elasticsearch:search template

Elasticsearch学习笔记Search API 与 Query DSL