Search ledger · 2026-09-05
搜索提交、抓取与索引状态怎样防止越级?
把每个信号写成追加事件,并让状态投影只接受对应证据,才能避免一次提交回执把页面直接推到“已收录”。本文聚焦台账实现,与已有的证据层级说明不同:重点是非法迁移如何被系统拒绝。
状态不是一个可随意覆盖的字符串
同一规范URL可能先技术就绪,再提交、被可信蜘蛛抓取、获得权威索引确认或出现在公开结果。建议保存technical_verified、submitted、trusted_crawled、indexed_verified、publicly_searchable等独立事件;当前状态由事件投影生成,而不是后台人员直接编辑。
每个事件至少绑定URL、引擎、证据类型、观察时间、工件摘要与写入者。重新提交只追加新的submitted事件,不会抹掉此前失败,也不会提升索引状态。
为每种迁移定义唯一证据门
技术就绪来自状态码、canonical、robots与Sitemap检查;submitted来自站长工具或协议回执;trusted_crawled来自通过身份核验的正文请求或站长抓取诊断;indexed_verified来自权威索引工具;publicly_searchable来自可判定的公开结果。
索引证据不一定要求此前存在提交事件,因为自然发现可以绕过主动提交。状态机不应强迫现实按理想顺序发生,而应阻止证据互相冒充:允许“无提交但已公开检索”,拒绝“有提交所以已索引”。
失败、未知与撤销也要成为一等事件
查询被验证码阻断时登记observation_blocked,不把页面标成未索引;公开结果明确没有目标URL,记录本次not_observed与查询条件,不能永久断言未收录。页面下线、canonical改变或索引移除时追加失效事件,并保留过去曾经成立的证据。
聚合报告按引擎与URL计算最新有效投影,同时展示证据时间。跨引擎不能合并:Bing抓取不代表百度抓取,某引擎公开可检索也不代表模型已经选源。
用非法迁移测试守住报表
- 仅提交回执尝试写indexed,必须拒绝。
- 伪造蜘蛛UA尝试写trusted_crawled,必须降为声明。
- 公开结果挑战页尝试写not_observed,必须保留blocked。
- 旧URL已退役后新抓取,不得恢复当前内容版本的状态。
- 同一事件重放,幂等且不增加计数。
事实边界是台账正确只能提高测量可信度,不会促成抓取或索引。下一动作应由当前最短证据缺口决定;没有权威索引信息时,结论仍是未知,而不是0。
怎样做一次可复现的迁移检查
准备同一URL的五份工件:技术检查摘要、提交回执、伪造UA日志、可信正文抓取和公开结果命中。按不同顺序写入事件,投影结果都应只由证据本身决定。例如先获得公开检索、后来才补提交回执,系统可以同时保留两项事实,但不能把提交时间写成发现起点。
检查清单还应覆盖跨引擎、跨版本和重复事件。任何事件缺少规范URL、引擎、观察时间或工件摘要时停止投影;旧版本URL的抓取不得推进新版本曝光窗口。若报告与事件台账不一致,先修投影,不通过手工改报告掩盖。
把乱序事件写成明确输入与预期输出
以下为同一URL、同一引擎的合成事件,时间只是测试值:E2在10:00观察到权威工具确认已索引,10:02入库;E1是在09:00收到的提交回执,因补录到11:00才入库;E3在11:05再次写入E2的相同事件键。
预期输出应同时保留submitted=true(观察时间09:00)与indexedVerified=true(观察时间10:00),E3幂等不增加索引计数。可信抓取日志没有取得,trustedCrawled保持未知,但这不撤销独立索引证据。不能按最后入库的E1把状态倒退为“仅提交”,也不能把09:00填成索引确认时间。
再加入另一引擎的索引确认,第一引擎状态不得变化;加入明确针对本URL的后续索引移除证据时,才改变当前有效投影,并保留历史。这里检查的是事件时间、写入时间和证据范围,而不是强迫网站走完每一级。可对照六类互补搜索证据理解为什么缺少抓取日志不等于没有索引。