You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 更新Gemfile:
gem 'ransack'
gem 'searchkick'
gem 'opensearch-ruby', '~> 2.0' # 版本需匹配Bonsai集群的OpenSearch版本
  1. 安装依赖并提交:
bundle install
git add Gemfile Gemfile.lock
git commit -m "Switch to opensearch-ruby client"
  1. 修改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
  1. 重新部署Heroku:
git push heroku main

额外检查

  • 登录Bonsai控制台确认集群的具体版本(OpenSearch/Elasticsearch),确保客户端版本与服务端版本兼容
  • 若使用方案2,需保证opensearch-ruby版本与Bonsai集群版本差距不超过1个大版本

内容的提问来源于stack exchange,提问作者Monroe Mann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:12:03