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
报错信息
- 执行
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)
- 执行
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核心的配置目录:
- 先获取容器ID:
docker ps | grep solr # 得到solr容器ID docker ps | grep app # 得到app容器ID - 复制文件:
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
相关产品推荐
相关产品推荐

