Project NOMAD按症状找药:从烧伤、发热到腹泻的OTC匹配完全指南
【免费下载链接】project-nomadProject NOMAD is an offline-first knowledge and education server. Wikipedia, thousands of books, courses, maps, and optional local AI, all running on hardware you own with no internet required.项目地址: https://gitcode.com/GitHub_Trending/pr/project-nomad
Project NOMAD是一个离线优先的知识与教育服务器,其中的药品参考(Drug Reference)模块支持按症状找药:从烧伤、发热到腹泻,它会根据 FDA 官方药品标签,帮你匹配出对应的非处方药(OTC)。无需联网、无需搜索网站,所有数据都跑在你自己的硬件上。本文带你走通从安装数据到按症状搜索的完整流程,并拆解它背后的 OTC 匹配逻辑。
为什么需要"按症状找药"?
平时我们在网上找药,往往要先知道药名。但真实的场景常常相反:你知道自己哪里不舒服,却不知道该用什么药。
Project NOMAD 的药品参考把这两个方向都做好了:
- 按药名搜索:输入品牌名或通用名,查看适应症、剂量、警告和成分。
- 按症状搜索(By situation):从问题出发,选择"烧伤""发热""腹泻"等症状,列出 FDA 标签覆盖这些症状的药品。
- 反向链接:在药品详情页,还能看到该药"常用于哪些情况",形成症状 ↔ 药品双向互链。
官方文档中对此的原文描述是:"Start from the problem instead of the product"(从问题出发,而不是从产品出发)。详见 drug-reference.md。
⚠️重要提示:这是健康信息,不是医疗建议。Project NOMAD 展示的是制造商的 FDA 标签原文和 OTC 匹配结果,不能替代医生、药师或护士。请始终遵循你手中实际产品的说明。
第一步:安装 FDA 药品数据(约需 8-10 GB)
药品参考是可选组件,默认不安装,因为数据集较大。有两种安装入口,最终效果相同:
- 从主界面进入Content Explorer,选择Medicine分类;
- 选中Standard层级(其中包含 FDA Drug Reference);
- 确认下载。
也可以在 Drug Reference 页面直接点Download FDA drug data按钮。整个过程分两个阶段在后台进行:
| 阶段 | 内容 | 大小 |
|---|---|---|
| ⬇️ Download | 拉取 openFDA 药品标签数据集(支持断点续传) | 约 1.7 GB(压缩) |
| 📇 Indexing | 将标签导入离线全文搜索数据库 | 解压后约 8-10 GB |
你不需要守在页面旁——离开后下载和索引会继续,索引完成后搜索功能自动开启。开启"自动内容更新"后,NOMAD 还会定期检查 openFDA 是否发布了新数据集并自动刷新。
按症状搜索 OTC 药品的操作步骤
数据装好后,Drug Reference 页面有三个标签页,其中"By situation"就是按症状找药的主入口:
- 在症状选择器中点选一个或多个症状(如烧伤、发热、腹泻);
- 页面列出所有 FDA 标签覆盖该症状的药品,并按相关度排序;
- 每个结果按"品牌名 + 通用名"折叠为一行,避免同一成分出现几十个近似的商品;
- 结果中OTC 药品永远排在最前面,方便直接购买使用。
💡 多选症状时,NOMAD 会优先查找同时覆盖所有症状的药品,找不到再按每个症状分别展示——这在多种症状并存、想找"一款产品搞定"时特别实用。
匹配逻辑拆解:从"burns"到搜索结果
按症状搜索的核心是一套精心策划的症状骨架(condition spine),其唯一数据源是 conditions.json,构建时生成到 conditions.ts:
{ "slug": "burns", "label": "Burns", "category": "Skin & wounds", "searchTerms": ["burns", "minor burns", "sunburn", "scald", "minor burn"] }每个症状包含一组同义词(searchTerms),覆盖用户可能的各种表达。以烧伤为例,burns、sunburn(晒伤)、scald(烫伤)都能命中同一组药品。内置症状按四大类别组织:
| 类别 | 代表症状 |
|---|---|
| Pain, fever & inflammation(疼痛、发热与炎症) | 头痛、肌肉关节痛、发热、痛经 |
| Cold, cough & allergy(感冒、咳嗽与过敏) | 咳嗽、鼻塞、喉咙痛、过敏 |
| Stomach & digestion(胃与消化) | 胃灼热、腹泻、便秘、恶心呕吐、晕车 |
| Skin & wounds(皮肤与伤口) | 烧伤、擦伤割伤、蚊虫叮咬 |
查询是如何构建的
匹配逻辑实现在 condition_service.ts 中,关键点:
- 同义词 OR 扩展:buildIndicationQuery 把 searchTerms 拼成一条 MySQL 全文检索查询。多词短语(如
sore throat)会被加双引号按短语匹配,牺牲少量召回换取精度;单词直接通过。NATURAL LANGUAGE MODE 把它们当作 OR 式相关度查询——任一同义词命中即可,按相关度排序。 - 全文检索 + LIKE 兜底:查询词中最长 token ≥ 3 个字符时走 FULLTEXT 索引
ft_drug_labels_name_indications;太短或索引异常时自动降级为LIKE '%term%',保证搜索永远可用。 - OTC 强过滤:SQL 中固定
product_type = 'HUMAN OTC DRUG'(见 orderOtcFirst),确保按症状浏览时只出现非处方药——这是面向消费者的场景,处方药不该抢镜。
自由文本:不选症状,直接输入描述
如果症状列表里没有你想要的那一项,可以直接输入自由文本(如 "athlete's foot")。处理逻辑在 drugsForFreeText:
- 主路径:把输入解析回策划症状的 slug(大小写不敏感的精确/子串匹配),例如手输 "burns" 依然会命中策划条目,走与点选完全相同的匹配;
- 兜底路径:解析不到时,对药品适应症文本做直接匹配。
附加层:天然疗法与自然补救
每个症状页除了 OTC 药品,还会尝试展示天然疗法(草药 + 居家护理措施),数据来自 natural_remedies.json 与 home_remedies.json,来源为 NCCIH、CDC、FDA 等美国公共领域资料。
比如选择"burns"时,芦荟胶(Aloe vera)、茶树油(Tea tree oil)等条目会因conditions数组包含burns而被 remediesForCondition 精确过滤出来。
需要注意的是,这部分"肯定性内容"目前默认关闭(由 affirmative_remedies.ts 的门控控制),默认体验只包含受监管的 FDA 标签匹配——这也是它保持严谨的原因之一。
反向链接与结果页结构
药品详情页上还有一个"常用于(Commonly used for)"区块:反向查找 situationsForIndications 会把药品标签的适应症文本与所有症状的 searchTerms 做子串匹配,告诉你这款药还能应对哪些情况,点一下即可跳转回症状页(通过/drug-reference?situation=<slug>深链)。
单个症状详情页(conditions/show.tsx)的呈现层次也很清晰:
- 顶部常驻安全横幅(SafetyBanner),不可绕过;
- 药品列表区:区分"还没装数据"(引导去 Drug Reference)和"有数据但无匹配"两种空状态;
- 每条结果行(DrugResultRow)链接到完整标签详情,可进一步并排对比两款药的警告章节。
对比功能只做"警告并排展示",不计算药物相互作用——两种药能否同服,请交给药师或医生。
关键文件导航
| 模块 | 路径 |
|---|---|
| 症状数据源 | conditions.json |
| 症状骨架(生成文件) | admin/app/data/conditions.ts |
| 匹配服务层 | admin/app/services/condition_service.ts |
| 纯函数工具(查询构建/排序) | admin/util/conditions.ts |
| HTTP 路由层 | admin/app/controllers/conditions_controller.ts |
| 症状详情前端页 | admin/inertia/pages/conditions/show.tsx |
| 按症状搜索 UI | admin/inertia/pages/drug-reference/index.tsx |
| 官方使用文档 | admin/docs/drug-reference.md |
总结
Project NOMAD 的按症状找药,本质上是把"症状 → 同义词 → FDA 标签适应症全文匹配"串成一条离线流水线,并用 OTC 强过滤和稳定排序保证结果对普通人友好。当你下一次在野外或断网环境下遇到烧伤、发热或腹泻时,这套逻辑能让你在没有互联网的情况下,依然拿到基于官方标签的可靠 OTC 参考——当然,紧急情况请优先寻求专业医疗帮助。
【免费下载链接】project-nomadProject NOMAD is an offline-first knowledge and education server. Wikipedia, thousands of books, courses, maps, and optional local AI, all running on hardware you own with no internet required.项目地址: https://gitcode.com/GitHub_Trending/pr/project-nomad
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考