前阵子翻自己几年下来的中医笔记,越翻越难受:纸质的本子按时间排,想找"失眠用什么"得从头翻;电子的散在几个备忘录里,搜都搜不齐。
索性整理了一遍,一共764 条,做成了一个能直接搜的网页:岐黄诊疗库(zy365.net)。
内容是什么形态
先说清楚它不是什么,免得误解:
不是系统教材,不是方剂大全,是我自己记下来的单方、穴位、食疗和小思路,比如:
- 失眠 → 炒酸枣仁(睡眠不好用生的、睡不踏实用炒的),15g 捣碎加白糖煎汤代茶
- 咳嗽痰多 + 体胖痰湿 → 三子养亲汤、二陈汤
- 咽痒咳嗽分不清寒热 → 肺俞、膻中、列缺、风门、大椎刮痧
- 嘴角发炎 → 黄豆芽、三豆乌梅白糖汤
- 翼状胬肉(热性)→ 白虎汤,或生石膏 30g 分三次冲服
所以它的定位是"按症状快速查一个思路",不是让你自己开方。
检索方案:关键词 + 向量混合
一开始我只做了关键词匹配,结果很糟:搜"睡不着"命中不了"失眠",搜"咳"命中不了"咽痒咳嗽"。中文字短、同义多,纯关键词基本废掉一半。
后来的方案是混合检索:
- 先用百炼的
text-embedding-v3把 764 条离线向量化(int8 量化后存 JSON,约几十 KB,直接跟知识库放一起) - 查询时同时算两条路径:
- 关键词路径:粗切词 → 标题/正文分别计分(标题权重更高)→ 二元组 bigram 加噪
- 向量路径:查 embedding,算余弦,低于阈值 0.55 且关键词也没命中的直接淘汰 - 最后加权排序:向量 0.68 + 关键词 0.32,命中关键词个数越多再加一点加权
实测下来,从"全库 764 条"能压到几十条,排序也基本合理。代码里所有向量相关的步骤都包了try/catch,任何一步挂了就悄悄退回纯关键词——检索绝不能被向量链路拖死,这是整个功能里我改得最多的地方。
部署:一个函数搞定
没有单独的后端,全部塞在一个阿里云函数计算(FC)实例里,nodejs18:
- 静态页 + 764 个词条页 +
/api/*全在同一个函数里路由分发 - 知识库文件在 bundle 里,浏览器拿不到原始数据(零泄露)
- 搜索日志、爬虫日志写 OSS,配生命周期规则自动过期
一个只在搜引擎优化里才踩得到的坑
词条页是服务端渲染的。这点很关键——第一版首页是纯前端渲染,百度蜘蛛抓完首页就"到底了",HTML 里一个/term/链接都没有,等于整站对搜索引擎只有 1 个页面。
补了静态索引入口之后,抓完的 HTML 里才能看到/terms的各个分页链接。
另外搜索引擎对"隐藏内容"很敏感,我试过把索引入口塞进<noscript>:开着 JS 的正常访客完全看不到,不执行 JS 的爬虫照样读得到。这是标准用法,不是作弊。
现在的样子
首页输入症状就能查,词条页有正文和相关词条互链,764 条都能打开。手机上也正常。
站点:岐黄诊疗库 · 中医症状调理知识库
最后说一句
站里每一页底部都写着:内容仅供学习参考,不能替代执业医师面诊,用药请遵医嘱。
这话不是套话。笔记里那些单方、穴位,是给别人指个方向用的,真要上药、要扎针,还是得找执业中医师当面看。急症别自己扛,直接去医院。
如果你也在整理自己的学习笔记,欢迎交流。
免责声明:本站内容整理自个人学习笔记,仅供学习参考,不构成医疗诊断或治疗建议。方药、灸刺请在执业中医师指导下使用,急重症请及时就医。