Heroku中创建联系人时触发Searchkick的Elasticsearch不支持产品错误
问题解决:Elasticsearch::UnsupportedProductError(Bonsai+Searchkick+Rails)
问题背景
技术栈:Ruby on Rails 7, Search Kick, Elasticsearch, Bonsai, Heroku
创建新联系人时触发500错误,日志输出:
[c6d3f6d0-156c-4546-a7e8-5175d14c6835] Completed 500 Internal Server Error in 78ms (Searchkick: 16.2ms | ActiveRecord: 38.6ms | Allocations: 14934) 2024-04-18T13:37:40.040852+00:00 app[web.1]: F, [2024-04-18T13:37:40.040771 #2] FATAL -- : [c6d3f6d0-156c-4546-a7e8-5175d14c6835] 2024-04-18T13:37:40.040853+00:00 app[web.1]: [c6d3f6d0-156c-4546-a7e8-5175d14c6835] Elasticsearch::UnsupportedProductError (The client noticed that the server is not a supported distribution of Elasticsearch.):
当前配置:
SearchKick初始化器
if Rails.env == 'production' url = ENV["BONSAI_URL"] transport_options = { request: { timeout: 250 } } options = { hosts: url, retry_on_failure: true, transport_options: transport_options } Searchkick.client = Elasticsearch::Client.new(options) end
Gemfile
gem 'ransack' gem 'searchkick' gem 'elasticsearch', '~>7.17'
问题原因
Bonsai目前多数集群已迁移至OpenSearch(Elasticsearch的开源分支),而你使用的elasticsearch gem 7.17版本会强制检测服务器是否为官方Elasticsearch发行版,因此触发这个错误。
解决方案
方案1:禁用Elasticsearch客户端的产品检测(快速修复)
修改config/initializers/searchkick.rb,添加product_check: false参数跳过发行版检测:
if Rails.env == 'production' url = ENV["BONSAI_URL"] transport_options = { request: { timeout: 250 }, ssl: { verify: false } # 解决Heroku环境下可能的证书验证问题 } options = { hosts: url, retry_on_failure: true, transport_options: transport_options, product_check: false # 关键:关闭产品类型检测 } Searchkick.client = Elasticsearch::Client.new(options) end
修改后重新部署Heroku:
git add config/initializers/searchkick.rb git commit -m "Fix Elasticsearch UnsupportedProductError" git push heroku main
方案2:切换到OpenSearch官方客户端(长期适配)
如果Bonsai集群明确使用OpenSearch,建议替换为官方的opensearch-ruby gem:
- 更新Gemfile:
gem 'ransack' gem 'searchkick' gem 'opensearch-ruby', '~> 2.0' # 版本需匹配Bonsai集群的OpenSearch版本
- 安装依赖并提交:
bundle install git add Gemfile Gemfile.lock git commit -m "Switch to opensearch-ruby client"
- 修改Searchkick初始化器:
if Rails.env == 'production' url = ENV["BONSAI_URL"] transport_options = { request: { timeout: 250 } } client = OpenSearch::Client.new(hosts: url, transport_options: transport_options) Searchkick.client = client end
- 重新部署Heroku:
git push heroku main
额外检查
- 登录Bonsai控制台确认集群的具体版本(OpenSearch/Elasticsearch),确保客户端版本与服务端版本兼容
- 若使用方案2,需保证
opensearch-ruby版本与Bonsai集群版本差距不超过1个大版本
内容的提问来源于stack exchange,提问作者Monroe Mann
相关产品推荐
相关产品推荐

