结论先说:当输入对象从“词”变成“网址、文档或一批ID”时,不要继续沿用原来的输入规范,而应把规范拆成两层——一层约束对象本身是否合法,另一层约束对象的粒度是否与查询意图一致。只改格式校验、不改粒度规则,通常会让结果看起来正常但实际不可用。是否要重建规范,取决于对象格式变化是偶发兼容问题,还是长期输入形态的迁移。
对象格式变化有两种性质,处理代价差别很大。第一种是偶发兼容:平时输入的是短语,偶尔有人贴进来一条带参数的链接或一段带编号的清单。第二种是形态迁移:输入源本身换了,比如从人工逐个输入词,改为由上游系统批量输出对象列表。前者适合在入口处做清洗和提示,后者必须重写输入规范,否则每次都要靠人工兜底。
区分方法很直接:统计最近一批输入里,新格式占比是否稳定超过一个需要单独处理的水平。假设某团队原来全部输入短词,现在约三成输入是链接形式——这只是说明“出现了新格式”,并不能证明旧规范失效;但如果上游系统已经改为只输出链接,那旧规范就是结构性失效,而不是偶发噪声。这里要注意,输入量或某种格式占比的变化,不能单独证明规范改对了,也可能是采集口径、去重规则或上游字段调整造成的。
面对格式变化,通常有两种看似合理的做法。
选择依据不是哪种更先进,而是错误代价落在哪一端。如果错误对象进入查询后很难被发现,优先选A并加显式校验;如果错误对象会破坏来源追溯,优先选B并接受口径差异。一个可操作的判断动作是:先取一小批新格式对象,按两种做法各跑一遍,比较两者在“对象识别失败”和“粒度不匹配”两类问题上的数量。哪一类问题更多,就先修对应的那一层,而不是同时改两层。
如果新格式对象本身携带了原规范无法表达的语义,上面的取舍就不适用了。例如原来输入的是单个词,现在输入的是“页面标题加目标地区”的组合对象。此时问题不再是格式转换,而是查询单元变了:一个对象对应多个查询维度。继续做归一化会把地区信息丢掉,继续分流也无法在单条路径内表达组合关系。这种情况下必须先把对象模型定义清楚,再谈输入规范,否则任何格式处理都只是把问题往后推。
规范落地建议按三步走。第一步,在输入层加一条可观测的校验:记录被拒绝的对象和拒绝原因,而不是只记录通过数量。第二步,对通过的对象抽样检查粒度是否与查询意图一致,重点看是否存在“格式合法但语义过粗或过细”的情况。第三步,把校验结果反馈到上游:如果拒绝集中在某一类格式,说明是上游输出问题;如果拒绝分散,说明是规范定义问题。这个动作的结果会直接决定下一步是改上游还是改规范,而不是凭感觉继续加规则。
需要提醒的是,具体工具对输入对象的支持范围、字段限制和当前行为,会随版本变化,使用前应以工具内实际说明为准,不要依据旧教程或第三方描述直接套用。规范里最好写明适用条件:对象类型、粒度、来源,以及不满足时是拒绝还是降级处理。这样格式再变时,改动点是有边界的,而不是整条链路重来。
把输入规范写成可检查的规则,并让每次格式变化都留下可追溯的拒绝记录,才能在对象形态继续演进时保持结果可比。