寓言故事
港口调度员给货签加上了隐形重量
河港每晚要处理几千船的货物调度。老调度员靠着一本厚厚的货签登记簿:每条船停靠哪个码头、属于哪个货主、运的是什么、目的地是哪。
问题从“找相似的货”开始。有商队需要一批和上次品质接近的棉布,可货签上只有”棉布、二级”几个字。调度员翻了半天,发现同样写着”棉布、二级”的船,因为产地、支数、染法不同,手感差远了。
有人引进了新标签:给每种货加上一段描述密文,描述密文之间可以直接比较相似度。工具上线第一天,商队高兴坏了,调度员也松了一口气。
没多久新麻烦又来了。商队不仅找相似的棉布,还会加限制:”和上次那批接近,但要山东产的,价格在三两以内,最近三天到货的。”密文能比相似度,可比不了产地、价格和到货日期。
调度员只好先把所有符合”山东产、三两以内、三天到货”的船捞出来,再对这几百条船逐一算密文相似度。两个步骤都慢,加起来更慢。
他们换了一套新的调度系统。每条船的标签上同时记着普通字段和描述密文。查询时,先在普通字段上做精确过滤,把符合条件的范围缩小;然后在这个范围内,只对密文做相似度检索。两个操作在一个查询里完成,不必分开跑。
有了这套系统,调度员可以做更复杂的混合查询:”先筛出去年十二月江南的船,再从剩下的找和这批最像的五条”。过滤器跑在结构化字段上,相似度跑在密文上,索引和计算各自独立,结果一步返回。新系统还允许商队只看自己的货域。甲商队找不到乙商队的私货,普通调度也不能随意翻高价契约。相似寻找和精确限制放在一起,速度、权限和更新才同时可管。
后来系统升级到能同时追踪查询速度、磁盘占用量和每条货签的更新频率。调度台甚至可以在同一份数据上划分多个子集,让不同商队只看到自己签约的货主。老调度员把登记簿收进抽屉:真正好用的调度系统,既要知道货和货有多像,也要知道货能不能运、该不该运。