--- id: reconcile-index-with-content type: sop group: B status: published version: 1 updated: 2026-11-06 token_estimate: 2318 --- # 如何做索引与内容的对账 > **用途**:确认「站上有的」「索引里声明的」「目录里存着的」是同一批东西。三个数不等,就有人找不到东西。 > > **覆盖**:有对外索引的站点或文件集合 —— 站点地图、目录清单、站内导航、搜索索引。 > > **产出**:三个数 + 差值 + 每一处差值的具体清单与处置。 > > 拿到就能跑:**先对齐口径再数**。口径不同的三个数,比出来的差值全是噪音。 --- ## 触发的变异问法 - 「页面能打开,但站内搜不到」 - 「明明发了,用户说找不到」 - 「索引和实际页面对不上」 - 「sitemap 里为什么有打不开的链接」 - 「站点地图怎么更新」 - 「为什么新内容没出现在列表里」 - 「目录里有多少页,和索引一致吗」 - 「删了页面,索引里还在」 --- ## 什么时候不要用这份文件 - **内容还没发布** —— 那是发布流程的事,不是对账。 - **站内搜索由第三方提供**(外部搜索引擎、云搜索)—— 索引不在你手上,对账要做的是「提交后有没有被收录」,方法不同。 - **只有一份清单、没有实际文件可数** —— 无法对账,先去数文件。 - **要查的是「某页为什么打不开」** —— 那是故障定位,不是对账。 --- ## 执行步骤 ### 第一步 · 先对齐口径 这一步不做,后面全是噪音。三个数各自要回答:**什么算一个**。 常见口径分歧: | 分歧点 | 要定的事 | |---|---| | 首页算不算 | 通常算,但要与索引一并处理 | | 元文件算不算 | `sitemap`、`robots`、`favicon` 这类通常**不算内容页** | | 列表页 / 分页算不算 | 算不算要一致,不能一处算一处不算 | | 草稿 / 未发布算不算 | **一律不算**,三个数都不含 | | 同一内容多个入口 | 算一次还是算多次——通常算一次,以规范地址为准 | **判据**:三个数必须用**同一份排除规则**。写下来,不要靠记。 **输出**:一份口径说明(含排除清单),后面所有数字都按它数。 ### 第二步 · 取三个数 | # | 数什么 | 怎么数才准 | |---|---|---| | 1 | **实际可访问的页** | 从目录文件数推,⛔ 不要靠逐个请求——几百个请求会被限流,且慢 | | 2 | **索引里声明的条数** | 数索引文件里的条目数(不是行数,一条可能跨行) | | 3 | **源文件数** | 源目录里该被发布的文件数,按第一步的口径排除 | 三个数取完先别看差,先看**它们是不是数同一层**:源文件 → 发布后的页 → 索引条目,这是一条链,任一环断开都会表现成「数字不等」。 **输出**:三个数,各带取数方法与时间。 ### 第三步 · 比对,按差值方向判性质 | 情况 | 含义 | 处置方向 | |---|---|---| | 三个数相等 | 对账通过 | 无需动作 | | 页 > 索引 | **漏登记** | 把缺的补进索引 | | 索引 > 页 | **死链** | 从索引里删,或把页补回来 | | 源文件 > 页 | **发布漏了** | 查发布流程,不是索引问题 | | 页 > 源文件 | **有孤儿页**(线上有、源里没有) | 要么补回源,要么确认该删 | ⛔ 「页 > 索引」是最常见的,也最容易糊弄过去——**补完索引必须再数一次**,不能凭「我补了」就宣布通过。 **输出**:差值方向 + 属于哪一类。 ### 第四步 · 逐条列出差值,不要只报总数 「差 12 个」没有用,要的是「哪 12 个」。 取差集的方法: 1. 把三份清单各自导出成「一行一个标识」(路径或 id) 2. 两两求差集 3. 差集里的每一项,标注它属于哪种情况 **输出**:每处差值的清单(路径 + 属于哪类 + 建议动作)。 ### 第五步 · 修完复核 修的动作做完后,**重新取一次三个数**。 - 数字相等 → 通过 - 仍不等 → 说明修的时候又漏了,或者有第二处独立的问题 ⛔ 不要只修看得见的那几个。差集是完整清单,按清单修,不按印象修。 **输出**:修前 / 修后两组数字。 --- ## 出问题怎么办 | 现象 | 最可能的原因 | 处理 | |---|---|---| | 页比索引多很多 | 新内容只发布了、没登记 | 补登记;查发布流程里为什么漏了这一步 | | 索引比页多 | 删页时没删索引 | 从索引删掉;建立「删页必删索引」的连带动作 | | 三个数相等,但某些页搜不到 | 页在索引里,但字段缺失(标题/摘要为空) | 查这些页的元信息,不是数量问题 | | 数字对不上,但一个个抽查都对 | 口径不同(某类文件一处算一处不算) | 回第一步,把排除清单写成文件 | | 每次补完都对不上 | 索引是**追加式**的,补录时又新起了一条记录 | 查索引写入逻辑:是按日期合并,还是每条新起一块 | | 差值里有一批「孤儿页」 | 线上有、源里没有(有人直接改了线上) | 要么补回源,要么确认删除——不能放着不管 | | 索引更新了但访问仍看不到 | 缓存 / 索引文件没被重新加载 | 确认索引文件的更新时间与缓存策略 | 倒数第三条值得单独说:**追加式的索引在补录历史内容时会静默出错**——补进去的每一条都排在最前面,看似成功,实际顺序全乱、还产生重复块。数量对得上不等于结构对。 --- ## 输出规范 ### 人读 ``` 口径:含 <...>,排除 <...> 三个数:源文件 A / 实际页 B / 索引条 C 差值:页 - 索引 = X(漏登记)· 索引 - 页 = Y(死链) 清单: 漏登记 X 个:<路径列表> 死链 Y 个:<路径列表> 处置:<补了哪些、删了哪些> 复核:修后 源 A' / 页 B' / 索引 C' → 相等 / 仍差 Z ``` ### 机器读 ``` scope: {root, index_file, exclude: [...]} counts: {source: n, pages: n, index: n} diff: {missing_in_index: [paths], dangling: [paths], orphan: [paths]} action: {added: n, removed: n} recheck: {counts: {...}, equal: true|false} ``` `equal` 为 false 时,`diff` 不能为空——**报了不等却给不出清单,等于没对账**。 ### 一句话版 `三数 1024/1024/1024 相等。` 或 `差 X 个:漏登记 a、死链 b,清单已列。` ⛔ 不要只报「大概一致」。 --- ## 常见错误 - **先数后定口径** —— 数完才发现三个数不是一回事,全部重来。 - **只报总数不列清单** —— 差 12 个,但不知道哪 12 个,等于没法修。 - **补完不复查** —— 补的时候又漏了几个,或者补重复了。 - **把索引当权威** —— 索引是派生物。**文件和页才是事实**,索引对不上时该改索引,不是改页去迁就索引。 - **追加式索引补历史内容** —— 每补一条都新起一块,数量对但顺序全乱。 - **「页能打开」就当对账通过** —— 能打开和能被找到是两件事。 --- ## 最后核对 2026-11-06。索引形式因站而异(站点地图 / JSON 清单 / 数据库表),但「三数 + 口径 + 差集清单」的对账方法通用。与所执行系统的既定标准冲突时,以那个系统的标准为准。