因为在Rails中使用ElasticSearch和Ransack+CircleCI配置时遇到了一些问题,所以做了一些记录
为了将来可能再次做类似的事情,我会把这个总结成自己的备忘录。
环境
由于ElasticSearch的不同版本可能存在许多更改点,因此我将提供以下相关信息。
-
- Mac OS X El Capitan(10.11.4)
-
- Ruby 2.2.2
rbenvを利用してインストールしてます
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15]
Java 1.8.0_74
ElasticSearch 2.3
先把病症和预防方法整理出来是为了弄清楚他迷上了什么。 (In order to figure out what he’s obsessed with, I’ll summarize the symptoms and avoidance methods first.)
Gemfile的中文释义
gem 'elasticsearch-model'
gem 'elasticsearch-rails'
我們實現了一個功能,可以從任何模型中使用ElasticSearch功能,並在其上添加了一個功能。
问题的内容 de
在开发环境中,代码可以按预期进行操作,所以将其推送到GitHub并在CircleCI上执行测试时。
Faraday::ConnectionFailed:
Connection refused - connect(2) for "localhost" port 9200
変得到报错。
规避策略
我們按照以下的順序進行了解決方案的嘗試並成功解決了!
-
- RansackのsearchとElasticSearchのsearchがコンフリクトするのが要因かと思い対応をする
解決せず
開発環境で問題ない。CircleCIの環境だけテストに失敗していたのでcircle.ymlにElasticSearchを利用する設定を追加して解決しました!
ちなみにローカルの環境でもElasticSearchが起動してない状態だと実はテストに失敗することをその後に知った
关于尝试的解决方案的补充说明。
以下是我的工作记录, 总结如下。
由于Ransack的搜索与ElasticSearch的搜索冲突,需要解决这个问题。
如果Ransack的search方法与其他gem等发生冲突,您可以在Ransack的GitHub上的Ransack #search方法中找到解决办法。
-
- by patching the extended class_method in Ransack::Adapters::ActiveRecord::Base to remove the line alias :search :ransack unless base.respond_to? :search
- by placing the following line in your Ransack initializer file at config/initializers/ransack.rb
有一种说法,我暂时选择了后者的做法。
填补
顺便提一下,原始的代码在创建config/initializers/ransack.rb之前就存在了。
Article.ransack(params[:q])
因为本来应该是 different factor,但是没有注意到那件事情…
在本地环境下,如果ElasticSearch未启动,它将无法正常运行。
我打算在与之前开发环境不同的机器上创建一个类似的环境。
./bin/rake db:migrate
在操作时出现了错误,原因不明。
当我查看消息时,出现了“连接被拒绝-无法连接到本地主机的9200端口”的提示。这个9200端口是用于ElasticSearch的。
-
- ElasticSearchのインストール&起動
- 再度db:migrate
所以,成功完成了迁移。
我在本地环境中没有启动ElasticSearch,我担心这可能导致测试失败。
-
- 一度ElasticSearchを終了させる
- RSpecを実行
完成后,
# Errno::ECONNREFUSED:
# Connection refused - connect(2) for "localhost" port 9200
当我启动ElasticSearch并且执行了RSpec后,显示结果与我预期的一样,并且测试顺利通过了!
闲谈
我原本打算在另一台机器上搭建类似的环境,是为了在工作会议上进行演示,但是在准备开始构建环境之前,我发现我的本地环境根本无法启动,这是一个非常糟糕的情况,让我相当焦急^^;