一个基于 Go 语言的高性能中国古诗词 API 服务
标签: 开源项目 / Go语言 / API服务 / 古诗词
原文: 微信公众号「码农先森」https://mp.weixin.qq.com/s/LpkAuDwzUVUNxOhoe7MQLA
GitHub: https://github.com/palemoky/chinese-poetry-api
核心亮点
一个基于 Go 语言的高性能中国古诗词 API 服务,支持 REST 和 GraphQL 双接口,提供简体/繁体中文双语支持,包含近 40 万首诗词数据。
为什么需要这个项目?
古诗词数据集在网上有不少,但:
- 数据分散:唐诗在一处、宋词在另一处,格式不统一
- 缺少 API:大多是静态数据,没有现成的查询接口
- 性能问题:Python 写的 API 并发能力弱,高并发场景撑不住
- 简繁问题:港澳台用户需要繁体,大陆用户需要简体,一套数据很难同时满足
chinese-poetry-api 把这些痛点一次性解决。
核心特性
| 特性 | 说明 |
|---|---|
| 🚀 高性能 | Go 语言编写,简繁转换 ~300ns/op,支持高并发 |
| 📚 海量数据 | 近 40 万首诗词(唐诗、宋词、元曲、诗经、楚辞等) |
| 🔍 强大搜索 | 全文搜索、标题/内容/作者分类搜索 |
| 🌏 双语支持 | 同一数据库同时存储简体和繁体,?lang= 参数切换 |
| 🎯 多种接口 | REST API + GraphQL 双接口支持 |
| 🛡️ 限流保护 | 内置 IP 限流,防止滥用 |
| 🐳 容器化 | Docker 镜像开箱即用,支持多架构(amd64/arm64) |
| 📊 智能分类 | 按朝代、作者、诗词类型自动分类 |
5 秒快速启动
方式一:Docker(推荐)
docker run -d -p 1279:1279 palemoky/chinese-poetry-api:latest
完整配置参见项目根目录的 docker-compose.yml。
方式二:Makefile
make help # 查看所有可用命令
make build # 构建项目
make process-data # 处理数据
make run-server # 启动服务
克隆仓库(包含 Submodules)
本项目使用 Git Submodules 管理诗词数据:
# 完整克隆(包含 submodules)
git clone --recurse-submodules --depth=1 https://github.com/palemoky/chinese-poetry-api.git
# 如果已经克隆了仓库,可以单独更新 submodules
git submodule update --init
API 使用详解
多语言支持
所有接口支持 lang 参数切换简繁体:
| 参数值 | 说明 |
|---|---|
zh-Hans | 简体中文(默认) |
zh-Hant | 繁体中文 |
REST API 示例
# 简体中文(默认)
curl "http://localhost:1279/api/v1/poems"
# 繁体中文
curl "http://localhost:1279/api/v1/poems?lang=zh-Hant"
# 搜索诗词(全文搜索)
curl "http://localhost:1279/api/v1/poems/search?q=静夜思"
# 随机诗词
curl "http://localhost:1279/api/v1/poems/random"
# 随机诗词(带过滤条件)
curl "http://localhost:1279/api/v1/poems/random?author=李白"
curl "http://localhost:1279/api/v1/poems/random?type=五言绝句"
curl "http://localhost:1279/api/v1/poems/random?author=李白&type=五言绝句"
curl "http://localhost:1279/api/v1/poems/random?author=李白&dynasty=唐"
# 作者列表(分页)
curl "http://localhost:1279/api/v1/authors?page=1&page_size=20"
# 朝代列表
curl "http://localhost:1279/api/v1/dynasties"
GraphQL API
端点:http://localhost:1279/graphql
# 繁体中文查询
query {
poems(lang: ZH_HANT, pageSize: 10) {
edges {
node {
title
content
author {
name
}
}
}
totalCount
}
}
# 搜索诗词
query {
searchPoems(query: "静夜思", searchType: TITLE) {
edges {
node {
title
author {
name
}
}
}
}
}
# 统计信息
query {
statistics {
totalPoems
totalAuthors
poemsByDynasty {
dynasty {
name
}
count
}
}
}
搜索功能详解
| 搜索类型 | 说明 | 示例 |
|---|---|---|
all | 全文搜索(默认) | ?q=月 |
title | 标题搜索 | ?q=静夜思&type=title |
content | 内容搜索 | ?q=床前明月光&type=content |
author | 作者搜索 | ?q=李白&type=author |
数据集统计
本项目基于 chinese-poetry 数据集,包含:
| 分类 | 数量 | 分类 | 数量 | 分类 | 数量 | 分类 | 数量 |
|---|---|---|---|---|---|---|---|
| 五言绝句 | 18,895 | 七言绝句 | 85,032 | 五言律诗 | 71,400 | 七言律诗 | 69,028 |
| 乐府诗 | 9,315 | 五代词 | 543 | 宋词 | 21,369 | 元曲 | 10,905 |
| 诗经 | 305 | 楚辞 | 65 | 论语 | 20 | 四书五经 | 14 |
| 其他 | 96,232 |
总计:近 40 万首
性能表现
Go 语言的并发优势在这个项目里发挥得很充分:
| 指标 | 表现 |
|---|---|
| 简繁转换 | ~300ns/op |
| 并发处理 | 天然支持(goroutine) |
| 内存占用 | 低(静态数据内存映射) |
| 响应延迟 | 毫秒级(P99 < 10ms) |
典型使用场景
| 场景 | 用法 |
|---|---|
| 古诗词 APP 后端 | 提供随机诗词、搜索、作者查询 |
| 微信小程序 | 每日推荐一首诗,调用 /api/v1/poems/random |
| 教育平台 | 按朝代/作者/类型筛选,辅助教学 |
| AI 训练数据 | 获取大量古诗词文本,用于 NLP 训练 |
| 个人博客 | 每日自动发布一首诗,调用 Random API |
部署建议
最低配置
CPU: 1 核
内存: 512MB
磁盘: 1GB(数据文件约 800MB)
Docker Compose 部署
version: '3.8'
services:
poetry-api:
image: palemoky/chinese-poetry-api:latest
ports:
- "1279:1279"
restart: unless-stopped
# 可选:限制内存
deploy:
resources:
limits:
memory: 512M
与其他方案对比
| 方案 | 语言 | 数据量 | REST | GraphQL | 简繁双语 | 部署难度 |
|---|---|---|---|---|---|---|
| chinese-poetry-api | Go | ~40万 | ✅ | ✅ | ✅ | ⭐ 简单(Docker) |
| 某 Python 诗词 API | Python | ~10万 | ✅ | ❌ | ❌ | ⭐⭐ 中等 |
| 静态 JSON 文件 | - | ~5万 | ❌ | ❌ | ❌ | ⭐⭐⭐ 需自建 API |
| 古诗文网爬虫 | - | 不稳定 | ❌ | ❌ | ❌ | ⭐⭐⭐⭐ 需自建 |
快速验证部署是否成功
# 1. 检查服务是否启动
curl -I http://localhost:1279/api/v1/poems/random
# 2. 获取一首随机诗词
curl "http://localhost:1279/api/v1/poems/random" | jq .
# 3. 切换繁体
curl "http://localhost:1279/api/v1/poems/random?lang=zh-Hant" | jq .
项目结构(简要)
chinese-poetry-api/
├── cmd/server # 服务入口
├── internal/ # 内部逻辑(handler, service, repository)
├── data/ # 诗词数据(submodule)
├── api/ # GraphQL schema 定义
├── Dockerfile
├── docker-compose.yml
├── Makefile
└── README.md
贡献与反馈
- GitHub Issues:bug 反馈、功能建议
- Pull Requests:欢迎贡献代码
- 数据集来源:chinese-poetry
写在最后
如果你在做一个古诗词相关的 APP、小程序、或者需要一个稳定的诗词数据源,这个项目可以直接用。
三行命令跑起来:
git clone --recurse-submodules https://github.com/palemoky/chinese-poetry-api.git
cd chinese-poetry-api
docker-compose up -d
然后访问 http://localhost:1279/api/v1/poems/random 就能拿到随机诗词了。
近 40 万首诗词,REST + GraphQL 双接口,简繁双语支持 —— 该有的都有了。
本文整理自微信公众号「码农先森」,原文链接:https://mp.weixin.qq.com/s/LpkAuDwzUVUNxOhoe7MQLA
*GitHub 项目地址:<ADDRESS_REDACTED>