寓言故事
药店掌柜把药性、方子和禁忌放在同一张药斗上
老字号的药店有三套独立的检索整套装置:一套按药名查,一套按症状查,一套按方剂查。掌柜说分开管最清楚,配药师傅也习惯了。直到有个急症方子:'找和麻黄汤功效接近的方剂,但要排除含麻黄的药,适合三岁以上儿童,能用医保。'配药师傅先翻方剂柜,再翻药名柜查成分,再翻症状柜查禁忌,然后对着三摞纸手动交叉。
小徒弟写了一张对照表贴在墙上,列着'麻黄汤→近似方→减麻黄→加年龄→加医保'的查找路径。两个星期后这张表已经被画满了例外和箭头,比直接查还让人头晕。
有人提议把三套整套装置合并成一个大总账柜,所有属性写在同一行。合并后查询确实简单了,但新问题出现:有些药方是文字描述,有些是数字指标,有些是草药配伍图谱,全塞进固定列里很快就字段爆炸。
新来的配药总监换了一套路子。他把每个药方当作一个独立对象,上面同时挂着:一组描述密文用于相似度匹配,一组结构化属性用于精确筛选,一组关键词用于字面搜索,还留出空间挂自定义的问答对和摘要。
查询时,药房可以同时调用这三种方式:用文字描述找功效最接近的方子,用结构化字段筛掉禁忌和年龄,用关键词锁定'健脾''祛湿'这样的术语。三个信号加权融合,一次返回结果。
他还在数据机关上做了类定义:每一类都预先声明了属性类型和索引方式。'方剂'类有药材列表、功效向量、禁忌条件;'药材'类有性味归经向量、价格、库存。不同类之间可以关联引用。
后来药房又接入了外部数据源:医保目录、疫情通报、新药审批公告。每个数据源以相同的数据机关接入,药方对象自动继承新信息。
老掌柜终于承认:药方不是一堆独立字段的拼凑,它是一个有结构、有语义、可以同时从多种角度检索的完整物。