2026 Meilisearch 自建全文搜索引擎:Docker 部署打造个人搜索服务
你的网站需要一个站内搜索功能?Elasticsearch 功能强大但资源占用感人——光 JVM 堆内存就要吃掉 1GB 起步。用 Algolia 吧,免费版只有 10000 条记录,超了就得每月 $50 起。Google Custom Search 倒是免费,但你的用户每搜索一次就给 Google 贡献一条数据,隐私堪忧。
Meilisearch 就是来解决这些痛点的。它是一个用 Rust 编写的开源全文搜索引擎,以极低的资源消耗提供毫秒级的搜索体验,支持中文分词、Typo 容错、Faceted 过滤、地理搜索,甚至内置了 AI 混合搜索能力。GitHub 上 58.2k Star 就是它实力的最好证明。
而且 Rust 写的东西有个天然优势:无 GC、内存安全、极致性能。Meilisearch 在 512MB 内存的 VPS 上就能跑得很舒服,一个 Docker Compose 文件搞定部署。
一、Meilisearch vs 其他搜索方案
| 对比项 | Meilisearch | Elasticsearch | Algolia | Google Custom Search |
|---|---|---|---|---|
| 语言 | Rust | Java | 商业闭源 | 商业闭源 |
| 价格 | 免费开源(MIT) | 免费开源(SSPL) | 免费额度后 $0.50/千次 | 免费 100 次/天,$5/千次 |
| 内存占用 | ~100MB 起步 | ~1GB 起步(需 JVM) | 托管无需关心 | 托管无需关心 |
| 部署方式 | Docker / 单二进制 | Docker / 集群 | SaaS | SaaS |
| 中文分词 | ✅ 内置 | ❌ 需插件 | ✅ | ✅ |
| Typo 容错 | ✅ 默认开启 | ❌ 需配置 | ✅ | ❌ |
| AI 混合搜索 | ✅ 支持 | ✅ 需插件 | ✅ | ❌ |
| 自建可控 | ✅ 完全可控 | ✅ 完全可控 | ❌ 数据在第三方 | ❌ 数据在 Google |
简单结论:如果你想要轻量、开箱即用、自己可控的站内搜索,Meilisearch 是最优解。 Elasticsearch 适合大规模日志分析场景,Algolia 适合不想运维的团队。
二、Docker Compose 一键部署
Meilisearch 的官方 Docker 镜像 getmeili/meilisearch 只有几十 MB,配置非常简单。
docker-compose.yml
version: '3.8'
services: meilisearch: image: getmeili/meilisearch:v1.48 container_name: meilisearch restart: unless-stopped ports: - "7700:7700" environment: - MEILI_MASTER_KEY=你的主密钥请改成随机字符串 - MEILI_ENV=production - MEILI_NO_ANALYTICS=true volumes: - ./meili_data:/meili_data启动
# 创建数据目录mkdir -p ./meili_data
# 启动容器docker compose up -d
# 检查日志docker compose logs -f meilisearch启动后访问 http://你的服务器IP:7700,你应该能看到 Meilisearch 的 API 欢迎页面。
安全提示:
MEILI_MASTER_KEY请务必生成一个强随机字符串。可以用openssl rand -base64 32生成。没有设置 master key 时搜索 API 是公开的,任何人只要知道你的服务器地址就能搜索甚至修改数据。
三、配置详解
3.1 主密钥(Master Key)
Master Key 是 Meilisearch 的安全基石。设置后:
- 默认所有 API 都需要鉴权
- 可以通过 Master Key 生成不同权限的 API Key(搜索专用、管理专用等)
- 未设置时运行在 “公开模式”,任何人都可以读写
environment: - MEILI_MASTER_KEY=your-super-secure-master-key3.2 中文分词
Meilisearch v1.x 版本已经内置了 中文分词支持(基于 Charabia 库),无需额外配置。你只需要创建索引时设置好语言:
# 创建索引时指定中文curl -X POST 'http://localhost:7700/indexes' \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "uid": "articles", "primaryKey": "id" }'
# 设置中文分词curl -PATCH 'http://localhost:7700/indexes/articles/settings' \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "localizedAttributes": [{"locales": ["zh"], "attributePatterns": ["title", "content"]}] }'中文搜索效果实测:搜索”手机”能匹配到”智能手机”、“手机壳”、“手机维修”等内容,分词准确率很高。
3.3 搜索设置优化
Meilisearch 提供了丰富的搜索设置,可以通过 API 配置:
# 设置可搜索属性curl -XPATCH 'http://localhost:7700/indexes/articles/settings' \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "searchableAttributes": ["title", "description", "content"], "filterableAttributes": ["category", "tags", "date"], "sortableAttributes": ["date", "title"], "rankingRules": ["words", "typo", "proximity", "attribute", "sort", "exactness"] }'3.4 AI 混合搜索(v1.8+)
Meilisearch v1.8 版本之后引入了 AI 混合搜索能力。要启用,需要配置一个嵌入模型:
environment: - MEILI_EXPERIMENTAL_ENABLE_VECTOR_SEARCH=true # 可选:使用本地嵌入模型(无需外部 API) - MEILI_EMBEDDER_SOURCE=hugging-face - MEILI_EMBEDDER_MODEL=all-MiniLM-L6-v2启用后,搜索结果会自动结合文本匹配和语义相似度,用户体验提升明显。
四、添加数据与搜索
4.1 导入数据
Meilisearch 支持 JSON 格式的批量导入:
curl -X POST 'http://localhost:7700/indexes/articles/documents' \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '[ {"id": 1, "title": "Go 泛型入门", "content": "Go 1.18 引入了泛型...", "date": "2026-06-20", "tags": ["go", "编程"]}, {"id": 2, "title": "Docker 容器化部署", "content": "Docker 让应用部署变得简单...", "date": "2026-06-19", "tags": ["docker", "部署"]}, {"id": 3, "title": "Rust 生命周期详解", "content": "生命周期是 Rust 最核心的概念之一...", "date": "2026-06-18", "tags": ["rust", "编程"]} ]'4.2 搜索查询
搜索 API 超级简单:
# 基本搜索curl 'http://localhost:7700/indexes/articles/search' \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"q": "docker 部署", "limit": 10}'
# 带过滤条件的搜索curl 'http://localhost:7700/indexes/articles/search' \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"q": "泛型", "filter": "date > 2026-06-01", "sort": ["date:desc"]}'返回结果通常只需 几毫秒到十几毫秒,即使是几十万条数据的索引也是秒级的响应。
4.3 前端集成
Meilisearch 提供了官方 SDK,覆盖几乎所有主流语言:
| 语言 | SDK 包名 | 安装方式 |
|---|---|---|
| JavaScript | meilisearch | npm install meilisearch |
| Python | meilisearch | pip install meilisearch |
| Go | meilisearch-go | go get github.com/meilisearch/meilisearch-go |
| Rust | meilisearch-sdk | cargo add meilisearch-sdk |
| Ruby | meilisearch-rails | gem install meilisearch-rails |
| PHP | meilisearch-php | composer require meilisearch/meilisearch-php |
前端集成示例(JavaScript):
import { MeiliSearch } from 'meilisearch'
const client = new MeiliSearch({ host: 'http://localhost:7700', apiKey: 'YOUR_SEARCH_API_KEY'})
const index = client.index('articles')const results = await index.search('docker 部署', { limit: 20, attributesToHighlight: ['title', 'content']})
console.log(results.hits)五、备份与恢复
Meilisearch 提供了两种备份机制:
5.1 Dumps(跨版本迁移)
Dump 是 Meilisearch 在不同版本之间导入/导出的推荐方式:
# 触发 Dump(API)curl -X POST 'http://localhost:7700/dumps' \ -H "Authorization: Bearer YOUR_MASTER_KEY"
# Dump 文件保存在 /meili_data/dumps/ 目录下# 恢复:启动时挂载 dump 文件docker compose down# 删除 meili_data/data.ms (老数据)rm -rf ./meili_data/data.ms# 重启时指定 dump 文件docker compose run --rm meilisearch \ --import-dump /meili_data/dumps/你的dump文件.dumpdocker compose up -d5.2 Snapshots(同版本快速恢复)
environment: - MEILI_SNAPSHOT_INTERVAL_SECONDS=86400 # 每天自动快照快照保存在 /meili_data/snapshots/ 目录,恢复时直接替换 data.ms 目录即可。
六、搭配反向代理
和自建服务系列的其他文章一样,建议用 Caddy 或 NPM 给 Meilisearch 加一层 HTTPS 反代:
search.你的域名.com { reverse_proxy meilisearch:7700}别忘了在 docker-compose.yml 中把 Meilisearch 加入反代的网络,并且不需要对外暴露 7700 端口(仅内部访问):
services: meilisearch: # ... 配置同上 networks: - internal # 移除 ports 暴露(仅通过反代访问)
caddy: # ... Caddy 配置 networks: - internal
networks: internal: driver: bridgeFAQ
Q: Meilisearch 免费版有什么限制? A: Meilisearch 是开源软件,社区版(MIT 协议)没有任何功能限制。企业版(商业许可)提供额外功能如更多嵌入模型支持。对于个人自建来说,社区版完全够用。
Q: 内存占用到底多少? A: 空载约 50-80MB,索引几万条数据后约 150-300MB。相比 Elasticsearch 动辄 1GB+ 的 JVM 堆内存,轻了一个数量级。
Q: 支持多少条数据? A: 社区版没有硬限制,百万级数据毫无压力。实测 50 万条文章数据,搜索响应时间仍在 50ms 以内。
Q: 中文搜索效果怎么样? A: 内置 Charabia 分词器对中文支持良好,常见场景下不需要额外配置。如果需要更精准的分词,可以配置自定义分词规则。
Q: 可以和 Elasticsearch 共存吗? A: 完全可以。很多团队的架构是:Elasticsearch 负责日志分析,Meilisearch 负责前端站内搜索。两个场景不冲突。
Q: 升级版本要注意什么? A: 建议先做 Dump 备份。跨主要版本升级时(如 v1.0 → v1.1),用 Dump 恢复最安全。小版本升级直接换镜像标签重启即可。
Q: Docker 部署要开放哪些端口? A: 默认只需 7700。如果通过反代访问,你甚至不需要暴露 7700 端口,完全通过内部 Docker 网络通信。
延伸阅读
- Docker 换源避坑指南 — 部署前的必备准备
- Nginx Proxy Manager 反代面板 — 统一管理所有服务的访问入口
- Listmonk 自建邮件营销平台 — 打造个人 Newsletter
Meilisearch 是目前自建搜索的最优选择之一,Rust 的极致性能让它成为站内搜索的首选。下一篇我们来聊聊另一个 Go 写的实用项目 —— Listmonk 自建邮件营销平台。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!