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

Docker环境下部署Solr与PostgreSQL并实现Solr从PostgreSQL拉取数据的配置求助

Docker环境下部署Solr与PostgreSQL并实现Solr从PostgreSQL拉取数据的配置求助

我完全懂你现在的难处——刚上手Solr、PostgreSQL和Docker这三个工具,凑在一起配置确实容易一头雾水!别着急,咱们把整个流程拆成几个小步骤,一步步来搞定它。

一、先用Docker Compose把所有服务跑起来

既然你已经指定了版本,咱们直接用Docker Compose来管理PostgreSQL、ZooKeeper、Solr的容器,这样它们能自动在同一个网络里通信,省得手动配置网络麻烦。

先创建一个docker-compose.yml文件,内容如下:

version: '3.8'

services:
  zookeeper:
    image: zookeeper:3.9
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181

  solr:
    image: solr:9.7.0
    container_name: solr
    ports:
      - "8983:8983"
    depends_on:
      - zookeeper
    environment:
      SOLR_ZK_HOST: zookeeper:2181
      SOLR_HEAP: 1g
    volumes:
      # 挂载PostgreSQL JDBC驱动到Solr的lib目录,记得把驱动包放到本地的./solr_lib目录下
      - ./solr_lib:/solr/server/solr/lib
      # 挂载自定义的core配置目录,后面会用到
      - ./solr_cores:/var/solr/data
    command: solr start -c -f

  postgres:
    image: postgres:16
    container_name: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: solr_user
      POSTGRES_PASSWORD: solr_pass
      POSTGRES_DB: solr_db
    volumes:
      # 挂载初始化SQL脚本,容器启动时自动创建表和插入数据
      - ./init_db:/docker-entrypoint-initdb.d

然后把你创建表和插入数据的SQL脚本保存到./init_db/init.sql文件里:

CREATE TABLE publications(
    id uuid,
    title varchar(255) NOT NULL,
    subtitle varchar(255),
    content text NOT NULL,
    createdAt timestamp NOT NULL,
    active bool,
    PRIMARY KEY (id)
);

-- 补全你没写完的插入语句,举个例子:
INSERT INTO publications (id, title, subtitle, content, createdAt, active)
VALUES 
('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', 'First Publication', 'Test Subtitle', 'This is the content of the first publication.', NOW(), true),
('b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12', 'Second Publication', NULL, 'Content of the second publication, no subtitle.', NOW(), false);

-- 给Solr用户赋予查询权限,确保能读取表数据
GRANT SELECT ON publications TO solr_user;

接下来,你需要下载对应PostgreSQL 16的JDBC驱动包(比如postgresql-42.7.4.jar),放到本地的./solr_lib目录下,Solr需要这个驱动才能连接PostgreSQL。

现在启动所有服务:

docker-compose up -d

二、创建Solr Core并配置数据导入

等所有容器都启动后,咱们先创建一个Solr Core来存储从PostgreSQL拉取的数据:

  1. 进入Solr容器:
docker exec -it solr bash
  1. 创建core:
solr create_core -c publications_core
  1. 退出容器:
exit

接下来,咱们需要修改这个core的两个配置文件:solrconfig.xml和data-config.xml。这些文件在你挂载的./solr_cores/publications_core/conf目录下。

1. 修改solrconfig.xml

在solrconfig.xml里添加DataImportHandler的配置,找到<config>标签,在里面加入:

<!-- 添加DataImportHandler的配置 -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  <lst name="defaults">
    <str name="config">data-config.xml</str>
  </lst>
</requestHandler>

2. 创建data-config.xml

在同一个conf目录下创建data-config.xml文件,内容如下,对应你的publications表结构:

<dataConfig>
  <dataSource 
    type="JdbcDataSource" 
    driver="org.postgresql.Driver"
    url="jdbc:postgresql://postgres:5432/solr_db"
    user="solr_user"
    password="solr_pass"
  />
  <document>
    <entity name="publication" query="SELECT id, title, subtitle, content, createdAt, active FROM publications">
      <field column="id" name="id" />
      <field column="title" name="title" />
      <field column="subtitle" name="subtitle" />
      <field column="content" name="content" />
      <field column="createdAt" name="createdAt" />
      <field column="active" name="active" />
    </entity>
  </document>
</dataConfig>

3. 配置managed-schema

最后,需要在managed-schema里定义对应表字段的Solr字段类型和字段,找到<schema>标签,加入:

<!-- 定义字段类型,对应PostgreSQL的类型 -->
<fieldType name="uuid" class="solr.UUIDField" indexed="true" stored="true" />
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>

<!-- 定义对应表的字段 -->
<field name="id" type="uuid" multiValued="false" required="true" stored="true" />
<field name="title" type="text_general" multiValued="false" stored="true" indexed="true" />
<field name="subtitle" type="text_general" multiValued="false" stored="true" indexed="true" />
<field name="content" type="text_general" multiValued="false" stored="true" indexed="true" />
<field name="createdAt" type="date" multiValued="false" stored="true" indexed="true" />
<field name="active" type="boolean" multiValued="false" stored="true" indexed="true" />

三、重启Solr并测试数据导入

配置完所有文件后,重启Solr容器让配置生效:

docker-compose restart solr

等Solr重启完成后,你可以通过两种方式触发数据导入:

  1. 通过Solr UI:访问http://localhost:8983/solr,进入publications_core,点击左侧的Dataimport,然后点击"Execute"按钮,选择"Full-import",点击"Execute"开始导入。
  2. 通过curl命令:
curl "http://localhost:8983/solr/publications_core/dataimport?command=full-import"

导入完成后,你可以在Solr UI里执行查询,比如输入*:*,就能看到从PostgreSQL拉取到的publications数据了!

一些需要注意的小细节

  • 确保Docker Compose里的服务名(比如postgres)和data-config.xml里的URL主机名一致,因为Docker容器之间用服务名通信。
  • JDBC驱动的版本要和PostgreSQL版本匹配,PostgreSQL 16推荐用42.7.x以上的驱动。
  • 如果你用的是Solr standalone模式(不用ZooKeeper),配置步骤类似,只是创建core的方式和配置存储路径稍有不同,但你提到了ZooKeeper,所以咱们用的是SolrCloud模式。

备注:内容来源于stack exchange,提问作者anvbis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 15:10:30