缺项本身不致命,致命的是把缺项当成零值或默认值继续计算,再拿这个结果去改页面、改报价或改投放。判断是否要暂停下游动作,关键看这个字段是否会影响“用户看到的价格、库存、时效或资格”。影响这些字段的,先隔离再补;只影响展示排序或辅助说明的,可以带缺项继续,但要在输出层标注。
阻断型缺项指缺失值会直接改变用户的决策结果。比如商品价格、服务是否可预约、配送范围、报名截止时间。这类字段一旦用空字符串、0或上一次的旧值兜底,页面会给出错误承诺,用户下单后无法履约,收入损失和投诉会同时出现。
可容忍型缺项指缺失值只影响展示完整度,不影响交易成立。比如商品的多角度描述、非必填的属性标签、文章的配图说明。这类字段缺失时,页面仍然能正常转化,处理优先级可以排后。
区分方法很简单:问一句“如果这个值是错的,用户会不会做出他本来不会做的动作”。会,就是阻断型;不会,就是可容忍型。两种类型的处理流程必须分开,否则要么过度阻断拖慢更新,要么漏掉关键字段造成扩散。
发现阻断型缺项后,第一步不是急着找数据,而是先切断扩散路径。具体动作包括:暂停该条记录进入页面渲染队列、暂停相关的结构化数据输出、暂停把该记录纳入比价或推荐模块。这一步的结果是:错误值不会出现在用户面前,后续补数据时也不会因为页面已缓存而反复回滚。
第二步是定位缺项的来源层级。常见有三种:采集层没抓到、清洗层被过滤掉、存储层字段未映射。三种原因对应的修复动作不同。采集层问题要补抓取规则;清洗层问题要检查过滤条件是否过严;存储层问题要核对字段映射表。如果不区分来源就统一重抓,可能重复劳动,也可能把已经正确的数据覆盖掉。
第三步是补数据后的验证。补完不要直接全量放开,先让该记录走一遍完整渲染链路,确认价格、库存、时效字段的输出与源数据一致,再解除冻结。这一步的结果决定下一步:如果验证通过,恢复该记录并记录本次缺项来源;如果不通过,说明映射或渲染逻辑还有问题,需要继续隔离,而不是反复补数据。
可容忍型缺项不需要冻结整条记录,但也不能让空值直接进入页面。处理方式是在输出层做两件事:一是给缺失字段一个明确的占位说明,比如“暂无该属性信息”,而不是留空或填0;二是确保该字段不参与任何排序、筛选或聚合计算。
举例来说,假设一个商品列表页按某属性排序,如果该属性缺失的记录被默认排到最前或最后,排序结果就会失真。此时应该把缺失记录排除在该排序规则之外,或者单独归为一组。这个动作的结果是:用户看到的排序仍然可信,缺失记录也不会因为排序异常而获得或失去不该有的曝光。
例外情况是:如果缺失字段恰好是用户筛选时常用的条件,那么它实际上已经接近阻断型。判断标准是筛选结果为空时,用户是否会误以为“没有符合条件的商品”。如果是,就应该按阻断型处理,先补数据再放开筛选。
假设某网站有两类记录同时出现缺项。A类记录缺少价格字段,B类记录缺少一段描述文字。如果对两类都采用“填0后继续”的策略,A类记录会以0元出现在列表和详情页,用户可能下单,但订单无法按0元履约,后续需要人工取消并解释,收入没有增加,信任受损。B类记录填0或留空,用户仍然能看到价格和购买入口,只是描述不完整,转化率可能略低,但不会产生错误订单。
正确的做法是:A类记录先冻结,补上价格后再放开;B类记录可以继续输出,但描述位置用占位说明,并且不把该记录纳入“描述完整度”相关的任何统计。这个例子说明,同样是缺项,处理方式取决于缺项是否影响交易成立,而不是取决于缺项的数量多少。
补完一次缺项不等于问题解决。如果缺项来自采集规则或映射逻辑,下一次更新时同样的缺项会再次出现。因此需要在补数据的同时,在入口处加一道校验:对阻断型字段,校验不通过就不允许进入渲染队列;对可容忍型字段,校验不通过就标记为缺失并跳过相关计算。
校验规则本身也要有例外处理。比如某些记录确实没有价格,因为它不是售卖商品而是展示内容。这种情况下不应该用同一套阻断规则,而应该在数据层先区分记录类型,再分别应用校验。这个动作的结果是:阻断规则不会误伤非交易类记录,同时交易类记录仍然受到保护。
最后,每次缺项处理都应该记录三件事:缺的是哪个字段、来源是哪一层、用了阻断还是可容忍策略。记录的作用不是留痕,而是下次出现同类缺项时能快速判断是否可以直接套用上次的处理方式,减少重复决策。