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拉取的数据:
- 进入Solr容器:
docker exec -it solr bash
- 创建core:
solr create_core -c publications_core
- 退出容器:
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重启完成后,你可以通过两种方式触发数据导入:
- 通过Solr UI:访问
http://localhost:8983/solr,进入publications_core,点击左侧的Dataimport,然后点击"Execute"按钮,选择"Full-import",点击"Execute"开始导入。 - 通过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

