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

Ruby3+Rails7+Solr9(Sunspot)Docker环境下无法重索引求助

Ruby 3 + Rails 7 + Solr 9(Sunspot)重新索引问题

环境配置

docker-compose.yml

version: '3'

services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password

  solr:
    image: solr:9.3.0
    ports:
      - "8983:8983"
    volumes:
      - search-data:/opt/solr/server/solr/mycores
    entrypoint:
      - docker-entrypoint.sh
      - solr-precreate
      - development
    depends_on:
      - db

  app:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails assets:precompile && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
      - bundle:/usr/local/bundle
      - tmp-data:/app/tmp
      - public-data:/app/public
    ports:
      - "3000:3000"
    depends_on:
      - db
      - solr

volumes:
  bundle:
  tmp-data:
  public-data:
  search-data:

config/sunspot.yml

production:
  solr:
    hostname: solr
    solr_home: solr
    port: 8983
    log_level: WARNING
    path: /solr/production
    # read_timeout: 2
    # open_timeout: 0.5

development:
  solr:
    hostname: solr
    solr_home: solr
    port: 8983
    log_level: INFO
    path: /solr/development

test:
  solr:
    hostname: solr
    solr_home: solr
    port: 8983
    log_level: WARNING
    path: /solr/test

报错信息

  1. 执行rake sunspot:solr:start时:
# rake sunspot:solr:start
rake aborted!
Sunspot::Solr::Server::JavaMissing: You need a Java Runtime Environment to run the Solr server
/usr/local/bundle/gems/sunspot_solr-2.6.0/lib/sunspot/solr/java.rb:11:in `ensure_install!'
/usr/local/bundle/gems/sunspot_solr-2.6.0/lib/sunspot/solr/server.rb:27:in `initialize'
/usr/local/bundle/gems/sunspot_solr-2.6.0/lib/sunspot/solr/tasks.rb:38:in `new'
/usr/local/bundle/gems/sunspot_solr-2.6.0/lib/sunspot/solr/tasks.rb:38:in `server'
/usr/local/bundle/gems/sunspot_solr-2.6.0/lib/sunspot/solr/tasks.rb:10:in `block (3 levels) in <main>'
Tasks: TOP => sunspot:solr:start
(See full trace by running task with --trace)
  1. 执行rake sunspot:solr:reindex时:
# rake sunspot:solr:reindex
rake aborted!
RSolr::Error::Http: RSolr::Error::Http - 400 Bad Request
Error: undefined field type

URI: http://solr:8983/solr/development/update?wt=json
Request Headers: {"Content-Type"=>"text/xml"}
Request Data: "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><query>type:Album</query></delete>"
...

解决方案

1. 解决rake sunspot:solr:start的Java缺失问题

你已经通过Docker单独部署了Solr容器,完全不需要在app容器里执行sunspot:solr:start——这个命令是用来启动Sunspot自带的内嵌Solr实例的,和你当前的独立Solr容器部署方式冲突。直接忽略这个命令,确保docker-compose中的solr服务正常运行即可。

如果你的app容器确实需要Java环境(比如有其他业务依赖),可以在项目的Dockerfile中添加Java安装步骤:

# 基于Ruby镜像安装OpenJDK
RUN apt-get update && apt-get install -y openjdk-17-jre-headless && rm -rf /var/lib/apt/lists/*

2. 解决reindex时的undefined field type问题

这个错误是因为Solr核心中缺少Sunspot要求的type字段定义,需要将Sunspot生成的专属schema配置导入Solr核心:

步骤1:生成Sunspot的schema.xml

在app容器中执行命令生成适配的schema文件:

bundle exec sunspot-solr schema --path ./tmp/solr/schema

步骤2:替换Solr核心的schema配置

通过Docker命令将生成的schema.xml复制到Solr核心的配置目录:

  1. 先获取容器ID:
    docker ps | grep solr # 得到solr容器ID
    docker ps | grep app # 得到app容器ID
    
  2. 复制文件:
    docker cp <app容器ID>:/app/tmp/solr/schema/schema.xml <solr容器ID>:/opt/solr/server/solr/mycores/development/conf/
    

步骤3:重启Solr容器

docker-compose restart solr

步骤4:重新执行索引命令

bundle exec rake sunspot:solr:reindex

可选:提前挂载schema配置到Solr容器

可以修改docker-compose.yml,直接将本地预先生成的schema.xml挂载到Solr核心,避免每次手动复制:

solr:
  image: solr:9.3.0
  ports:
    - "8983:8983"
  volumes:
    - search-data:/opt/solr/server/solr/mycores
    - ./config/solr/schema.xml:/opt/solr/server/solr/mycores/development/conf/schema.xml
  entrypoint:
    - docker-entrypoint.sh
    - solr-precreate
    - development
  depends_on:
    - db

注意:需要先在本地config/solr/目录下生成好schema.xml文件。

内容的提问来源于stack exchange,提问作者Hoang Duc Quan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:33:24