Skip to content

Commit bb0dfbf

Browse files
author
Ricco Xie
committed
feat: init v16.
1 parent df127ee commit bb0dfbf

4 files changed

Lines changed: 347 additions & 2 deletions

File tree

‎.github/workflows/docker-build.yml‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
name: Build and Push PostgreSQL 16 Image
2+
3+
on:
4+
push:
5+
branches: [ v16 ]
6+
pull_request:
7+
branches: [ v16 ]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- name: Checkout code
14+
uses: actions/checkout@v4
15+
16+
- name: Set up Docker Buildx
17+
uses: docker/setup-buildx-action@v3
18+
19+
- name: Login to Docker Hub
20+
if: github.event_name != 'pull_request'
21+
uses: docker/login-action@v3
22+
with:
23+
username: ${{ secrets.DOCKER_HUB_USERNAME }}
24+
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
25+
26+
- name: Extract metadata
27+
id: meta
28+
uses: docker/metadata-action@v5
29+
with:
30+
images: riccoxie/postgres-zh
31+
tags: |
32+
type=ref,event=branch
33+
type=ref,event=tag
34+
type=sha,format=short
35+
36+
- name: Build and push
37+
uses: docker/build-push-action@v5
38+
with:
39+
context: .
40+
push: ${{ github.event_name != 'pull_request' }}
41+
tags: ${{ steps.meta.outputs.tags }}
42+
labels: ${{ steps.meta.outputs.labels }}
43+
cache-from: type=gha
44+
cache-to: type=gha,mode=max

‎Dockerfile‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# 基于官方PostgreSQL 16镜像
2+
FROM postgres:16
3+
4+
# 切换为root用户执行安装操作
5+
USER root
6+
7+
# 安装依赖包
8+
RUN apt-get update && apt-get install -y --no-install-recommends \
9+
build-essential \
10+
git \
11+
libpq-dev \
12+
postgresql-server-dev-16 \
13+
wget \
14+
unzip \
15+
cmake \
16+
&& rm -rf /var/lib/apt/lists/*
17+
18+
# 安装zhparser扩展(基于SCWS的中文分词器)
19+
RUN git clone https://github.com/amutu/zhparser.git /tmp/zhparser && \
20+
cd /tmp/zhparser && \
21+
make && make install && \
22+
rm -rf /tmp/zhparser
23+
24+
# 安装pg_jieba扩展(结巴分词的PostgreSQL版本)
25+
RUN git clone https://github.com/jaiminpan/pg_jieba.git /tmp/pg_jieba && \
26+
cd /tmp/pg_jieba && \
27+
mkdir build && cd build && \
28+
cmake .. && make && make install && \
29+
rm -rf /tmp/pg_jieba
30+
31+
# 安装其他常用扩展包
32+
RUN apt-get update && apt-get install -y --no-install-recommends \
33+
postgresql-16-contrib \
34+
postgresql-16-pg-trgm \
35+
postgresql-16-hstore \
36+
postgresql-16-btree-gist \
37+
postgresql-16-pg-bigm \
38+
&& rm -rf /var/lib/apt/lists/*
39+
40+
# 复制初始化脚本到容器中
41+
COPY init-scripts/ /docker-entrypoint-initdb.d/
42+
43+
# 确保初始化脚本权限正确
44+
RUN chmod -R 755 /docker-entrypoint-initdb.d/ && \
45+
chown -R postgres:postgres /docker-entrypoint-initdb.d/
46+
47+
# 切换回postgres用户
48+
USER postgres

‎README.md‎

Lines changed: 228 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,228 @@
1-
# docker-postgres-zh
2-
支持常用中文功能的PGSQL镜像
1+
# Docker PostgreSQL 中文全文搜索镜像
2+
3+
这是一个基于 PostgreSQL 16 的 Docker 镜像,预装了中文全文搜索功能和相关扩展,特别适用于中文应用开发。
4+
5+
## 功能特性
6+
7+
### 🚀 核心功能
8+
9+
- **PostgreSQL 16**: 基于官方 PostgreSQL 16 镜像
10+
- **中文分词支持**: 集成 zhparser 和 pg_jieba 中文分词器
11+
- **全文搜索**: 支持中文全文搜索和模糊匹配
12+
- **扩展丰富**: 预装常用 PostgreSQL 扩展
13+
14+
### 📦 预装扩展
15+
16+
#### 中文分词扩展
17+
18+
- **zhparser**: 基于 SCWS 的中文分词器
19+
- **pg_jieba**: 结巴分词的 PostgreSQL 版本
20+
21+
#### 全文搜索扩展
22+
23+
- **pg_trgm**: 三元组匹配,支持模糊搜索
24+
- **pg_bigm**: 双字组匹配,提升中文搜索性能
25+
- **unaccent**: 去除重音符号
26+
27+
#### 其他实用扩展
28+
29+
- **hstore**: 键值对存储
30+
- **btree_gist**: B-tree 索引支持
31+
- **pg_stat_statements**: 查询性能统计
32+
33+
## 快速开始
34+
35+
### 使用 Docker 运行
36+
37+
```bash
38+
# 拉取镜像
39+
docker pull riccoxie/postgres-zh:v16
40+
41+
# 运行容器
42+
docker run -d \
43+
--name postgres-zh \
44+
-e POSTGRES_DB=zh-test \
45+
-e POSTGRES_USER=postgres \
46+
-e POSTGRES_PASSWORD=your_password \
47+
-p 5432:5432 \
48+
riccoxie/postgres-zh:v16
49+
```
50+
51+
### 使用 Docker Compose
52+
53+
```yaml
54+
version: '3.8'
55+
services:
56+
postgres:
57+
image: riccoxie/postgres-zh:v16
58+
container_name: postgres-zh
59+
environment:
60+
POSTGRES_DB: zh-test
61+
POSTGRES_USER: postgres
62+
POSTGRES_PASSWORD: your_password
63+
ports:
64+
- "5432:5432"
65+
volumes:
66+
- postgres_data:/var/lib/postgresql/data
67+
restart: unless-stopped
68+
69+
volumes:
70+
postgres_data:
71+
```
72+
73+
## 中文全文搜索使用示例
74+
75+
### 1. 连接数据库并创建测试表
76+
77+
```sql
78+
-- 连接到数据库
79+
\c zh-test
80+
81+
-- 创建文章表
82+
CREATE TABLE articles (
83+
id SERIAL PRIMARY KEY,
84+
title TEXT NOT NULL,
85+
content TEXT NOT NULL,
86+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
87+
);
88+
89+
-- 插入测试数据
90+
INSERT INTO articles (title, content) VALUES
91+
('人工智能的发展', '人工智能技术正在快速发展,深度学习、机器学习等技术不断突破'),
92+
('数据库优化技巧', 'PostgreSQL 数据库性能优化需要从多个方面考虑,包括索引、查询优化等'),
93+
('中文分词技术', '中文分词是自然语言处理的基础技术,对搜索引擎和文本分析至关重要');
94+
```
95+
96+
### 2. 创建全文搜索索引
97+
98+
```sql
99+
-- 使用中文配置创建全文搜索索引
100+
CREATE INDEX idx_articles_fts ON articles
101+
USING gin(to_tsvector('zhcn', title || ' ' || content));
102+
```
103+
104+
### 3. 执行中文全文搜索
105+
106+
```sql
107+
-- 搜索包含"人工智能"的文章
108+
SELECT title, content,
109+
ts_rank(to_tsvector('zhcn', title || ' ' || content),
110+
to_tsquery('zhcn', '人工智能')) as rank
111+
FROM articles
112+
WHERE to_tsvector('zhcn', title || ' ' || content) @@ to_tsquery('zhcn', '人工智能')
113+
ORDER BY rank DESC;
114+
115+
-- 使用 pg_trgm 进行模糊搜索
116+
SELECT title, content, similarity(title, '人工智能') as sim
117+
FROM articles
118+
WHERE title % '人工智能' OR content % '人工智能'
119+
ORDER BY sim DESC;
120+
```
121+
122+
### 4. 使用 pg_jieba 分词
123+
124+
```sql
125+
-- 使用 jieba 分词
126+
SELECT jieba_cut('这是一个中文分词的测试');
127+
128+
-- 创建基于 jieba 的全文搜索
129+
CREATE INDEX idx_articles_jieba ON articles
130+
USING gin(jieba_to_tsvector('simple', title || ' ' || content));
131+
```
132+
133+
## 配置说明
134+
135+
### 环境变量
136+
137+
| 变量名 | 默认值 | 说明 |
138+
|--------|--------|------|
139+
| `POSTGRES_DB` | `postgres` | 默认数据库名 |
140+
| `POSTGRES_USER` | `postgres` | 数据库用户名 |
141+
| `POSTGRES_PASSWORD` | - | 数据库密码(必需) |
142+
| `POSTGRES_INITDB_ARGS` | - | 初始化参数 |
143+
144+
## 开发指南
145+
146+
### 构建镜像
147+
148+
```bash
149+
# 克隆仓库
150+
git clone https://github.com/riccox/docker-postgres-zh.git
151+
cd docker-postgres-zh
152+
153+
# 构建镜像
154+
docker build -t riccoxie/postgres-zh .
155+
```
156+
157+
### 本地开发
158+
159+
```bash
160+
# 运行开发环境
161+
docker run -it --rm \
162+
-e POSTGRES_PASSWORD=dev_password \
163+
-p 5432:5432 \
164+
-v $(pwd)/script:/docker-entrypoint-initdb.d \
165+
riccoxie/postgres-zh:v16
166+
```
167+
168+
## 性能优化建议
169+
170+
### 1. 索引优化
171+
172+
- 为经常搜索的字段创建 GIN 索引
173+
- 使用 `pg_trgm` 扩展进行模糊搜索
174+
- 考虑使用 `pg_bigm` 提升中文搜索性能
175+
176+
### 2. 查询优化
177+
178+
- 使用 `ts_rank()` 函数进行相关性排序
179+
- 合理使用 `LIMIT` 限制结果集大小
180+
- 避免在 `WHERE` 子句中使用函数
181+
182+
### 3. 配置调优
183+
184+
```sql
185+
-- 调整全文搜索相关参数
186+
SET default_text_search_config = 'zhcn';
187+
SET pg_trgm.similarity_threshold = 0.3;
188+
```
189+
190+
## 故障排除
191+
192+
### 常见问题
193+
194+
1. **扩展安装失败**
195+
196+
```bash
197+
# 检查扩展是否正确安装
198+
docker exec -it postgres-chinese psql -U postgres -c "\dx"
199+
```
200+
201+
2. **中文分词不工作**
202+
203+
```sql
204+
-- 检查中文配置
205+
\dF+ zhcn
206+
207+
-- 测试分词
208+
SELECT to_tsvector('zhcn', '这是一个测试');
209+
```
210+
211+
3. **性能问题**
212+
213+
```sql
214+
-- 检查索引使用情况
215+
EXPLAIN ANALYZE SELECT * FROM articles WHERE to_tsvector('zhcn', title) @@ to_tsquery('zhcn', '测试');
216+
```
217+
218+
## 许可证
219+
220+
本项目基于 [MIT 许可证](LICENSE) 开源。
221+
222+
## 贡献
223+
224+
欢迎提交 Issue 和 Pull Request 来改进这个项目!
225+
226+
## 路线图
227+
228+
✅ 支持 PostgreSQL 16 和中文全文搜索

‎init-scripts/01-extensions.sql‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-- 启用核心扩展
2+
CREATE EXTENSION IF NOT EXISTS pg_trgm;
3+
CREATE EXTENSION IF NOT EXISTS hstore;
4+
CREATE EXTENSION IF NOT EXISTS btree_gist;
5+
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
6+
CREATE EXTENSION IF NOT EXISTS unaccent;
7+
CREATE EXTENSION IF NOT EXISTS pg_bigm;
8+
9+
-- 启用中文分词扩展
10+
CREATE EXTENSION IF NOT EXISTS zhparser;
11+
CREATE EXTENSION IF NOT EXISTS jieba;
12+
13+
-- 为zhparser创建配置
14+
CREATE TEXT SEARCH CONFIGURATION zhcn (PARSER = zhparser);
15+
ALTER TEXT SEARCH CONFIGURATION zhcn ADD MAPPING FOR n,v,a,i,e,l,j WITH simple;
16+
17+
-- 创建测试表和索引示例
18+
CREATE TABLE IF NOT EXISTS articles (
19+
id SERIAL PRIMARY KEY,
20+
title TEXT NOT NULL,
21+
content TEXT NOT NULL,
22+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
23+
);
24+
25+
-- 创建全文搜索索引
26+
CREATE INDEX IF NOT EXISTS idx_articles_fts ON articles
27+
USING gin(to_tsvector('zhcn', title || ' ' || content));

0 commit comments

Comments
 (0)