测试环境搭建与问题诊断
在上一篇文章中,我们完成了 MeiliSearch 的基础部署和索引创建,但搜索框的下拉显示功能存在问题。为了系统化地解决这个问题,我决定采用 OpenClaw 的三 Agent 协同工作流。
首先创建了测试环境:
- 目录:
/blog-staging(与生产环境隔离) - 容器:Docker 运行 nodejs 环境
- 端口:4000(可通过 localhost:4000 测试)
- 目标:所有修改先在测试环境验证,再合并到生产环境
OpenClaw 三 Agent 协同工作流设计
我创建了一个专门的 blog-feature-update skill,设计了三 Agent 协同工作流:
工作流架构
- 代码 Agent:负责修改代码和配置
- 部署 Agent:负责重新生成博客并重启服务
- 验证 Agent:负责自动化测试验证功能
每个 Agent 通过文件标志(.flag 文件)进行通信,形成完整的迭代开发循环:
1 | 用户需求 → 代码Agent → 部署Agent → 验证Agent → 结果反馈 |
验证 Agent 的自动化测试
为了确保每次修改都能可靠验证,我配置了验证 Agent 使用 Playwright 进行 UI 自动化测试:

中文字体问题:在容器环境中,Playwright 默认不包含中文字体,导致测试截图中的中文显示为方框。通过手动添加 simkai.ttf 字体文件解决:

六轮优化迭代过程
第一轮:修复下拉框显示
问题:API 请求成功(F12 可见),但下拉框不显示结果。
根本原因:JavaScript 数据处理逻辑 bug。searchMeilisearch 函数返回完整 API 响应,而 displayResults 函数期望处理后的数组。
代码 Agent 修复:
1 | // 修复前:返回完整API响应 |
验证结果:✅ 下拉框正常显示搜索结果
第二轮:优化显示格式
用户反馈:下拉框显示格式有问题,包含重复标题行。
原始显示:
1 | k8s证书延长有效期(标题,带超链接) |
新需求:
- 最多显示5个待选项
- 删除第二行的重复标题
- 时间+相关性混合排序
代码 Agent 修改:
- 数量限制:
limit: 10→limit: 5 - 删除重复:移除
excerpt相关代码 - 排序优化:添加
sort: ['date:desc']
技术问题:添加 sort: ['_score:desc', 'date:desc'] 导致 API 返回 0 个结果。
发现:MeiliSearch v0.24.0 不支持 _score:desc 排序参数。
解决方案:只使用 sort: ['date:desc'],依赖默认相关性排序。
优化后显示:
1 | k8s剩余资源计算脚本(标题,带超链接) |
第三轮:添加标签显示
用户需求:删除 URL 行和时间行,添加其他字段。
选择:添加标签(tags)字段,因为:
- 信息价值高
- API 已有该字段
- 格式简洁
- 用户友好
代码 Agent 修改:
- 删除 URL 显示代码
- 删除日期显示代码
- 添加标签显示逻辑:
- 最多显示3个标签
- 超过3个时显示”等X个标签”
- 无标签时显示”标签: 无”
- 添加 🏷️ 图标前缀
CSS Agent 添加样式:
1 | .meilisearch-suggestion-tags { |
优化后显示:
1 | k8s剩余资源计算脚本(标题,带超链接) |
第四轮:宽度调整
用户需求:将搜索框和下拉框长度扩展到1.5倍,保持居中。
初始状态:搜索框宽度 202px,容器最大宽度 500px。
第一轮扩展:
- 容器最大宽度:750px (500px × 1.5)
- 搜索框最小宽度:600px
- 结果:644px (3.2倍扩展,超出预期)
用户反馈:太宽了,缩减到400px。
最终调整:
- 容器最大宽度:400px
- 搜索框最小宽度:350px
- 结果:394px (接近400px目标)
第五轮:超链接修复
问题:下拉框中的文章链接点击跳转到无效链接。
根本原因:MeiliSearch 索引中的 URL 字段是旧格式 /posts/K8s-crt/,而实际 Hexo 生成的 URL 格式是 /年/月/日/文章文件名/。
解决方案:在 JavaScript 中动态生成正确的 URL。
代码 Agent 修复:
1 | // 从原始URL提取slug(Hexo使用文件名作为slug) |
验证结果:✅ 链接可正常跳转到文章页面
第六轮:视觉标识(最终撤销)
用户需求:在搜索框最左边添加小的黑色放大镜图标。
发现:图标原本就存在,但被 CSS 隐藏:
1 | /* style.css 中的隐藏规则 */ |
解决方案:移除隐藏规则,设置黑色:
1 | .meilisearch-icon { |
后续:用户觉得不需要,最终撤销此修改,恢复隐藏状态。
生产环境合并策略
所有功能在测试环境验证通过后,需要合并到生产环境,但要注意关键差异:
API 访问路径差异
- 测试环境:直接访问
http://114.55.64.10:7700 - 生产环境:使用
/search代理路径
API 密钥处理差异
- 测试环境:前端传递
X-MEILI-API-KEY头 - 生产环境:由 Nginx 反向代理自动添加,前端无需传递
合并实施
- JavaScript 文件:应用所有功能优化,但保持生产环境的 API 调用方式
- CSS 文件:直接复制所有样式优化
- 主题配置:保持
host: '/search'设置 - 测试文章:仅合并《OpenClaw多Agent协同测试》一篇
技术总结与经验
MeiliSearch 版本兼容性教训
- 问题:v0.24.0 不支持
_score:desc排序参数 - 现象:添加该参数导致 API 返回 0 个结果
- 解决:只使用
date:desc,依赖默认相关性排序 - 教训:使用开源工具时要关注版本特性差异
三 Agent 协同工作流优势
- 职责分离:代码、部署、验证各司其职
- 迭代可靠:验证失败可自动回退重试
- 通信简单:文件标志通信机制简单可靠
- 适合复杂任务:多步骤、需要验证的工作流
CSS 布局技巧
- 组合控制:
max-width+min-width实现弹性宽度 - 填充容器:
width: 100%确保填满父容器 - 下拉框同步:
left: 0; right: 0;实现与父容器同宽
Playwright UI 自动化测试价值
- 真实模拟:完全模拟用户操作流程
- 问题捕获:及时发现 JavaScript 错误和网络问题
- 可视化验证:截图提供直观的验证结果
- 回归测试:确保修改不会破坏现有功能
最终成果与反思
实现的功能
- 优雅显示:简洁的标题+标签,无冗余信息
- 智能排序:按相关性+时间混合排序
- 数量控制:最多显示5个最相关结果
- 正确链接:动态生成正确的 Hexo 文章 URL
- 适中宽度:400px 宽度,居中布局
- 安全访问:通过 Nginx 代理隐藏 API 密钥
vibe coding 工作模式反思
这次实践展示了 vibe coding(与 AI 协同编程)的有效工作模式:
- 人类角色:提供方向、决策、质量把控
- AI 角色:执行具体任务、快速迭代、处理细节
- 协同关键:清晰的指令、及时的反馈、系统化的工作流
OpenClaw 多 Agent 架构的价值
通过创建 blog-feature-update skill 和三 Agent 工作流,我们实现了:
- 可复用的流程:类似任务可直接套用此模式
- 质量保证:自动化验证确保每次修改可靠
- 效率提升:并行处理代码、部署、验证步骤
- 文档完整:整个过程有完整记录可供复盘
部署与后续
所有修改已通过 ./hexo.sh 脚本部署到生产环境,包含:
- 两篇技术文章(本篇及前篇)
- 完全优化的搜索功能
- 测试文章验证
搜索功能现在提供优雅、高效的用户体验,同时后台通过系统化的 AI 协作流程保证质量和可靠性。
本文完整记录了 2026年4月9日 使用 OpenClaw 三 Agent 协同工作流优化博客 MeiliSearch 搜索功能的详细过程。从工作流设计到六轮优化迭代,展示了如何通过系统化的 AI 协作解决复杂技术问题。