# 索引范围控制

URL: https://caijiao.org/pagefind/tutorial-03-indexing
Source: docs/pagefind/tutorial-03-indexing.md
Description: 讲解 data-pagefind-body、data-pagefind-ignore、root selector、include characters 等索引控制方式，避免搜索结果混入导航、页脚和无关内容。

Pagefind 默认从页面的 `<body>` 开始分析内容。文档站通常不希望导航、侧边栏、页脚、弹窗和广告进入搜索结果，因此需要明确控制索引范围。

## 使用 data-pagefind-body

把主要内容区域标记为 `data-pagefind-body`：

```html
<main data-pagefind-body>
  <h1>Pagefind 教程</h1>
  <p>这里是应该进入搜索索引的正文。</p>
</main>

<aside>
  这里是侧边栏，不进入正文索引。
</aside>
```

一旦站点中出现 `data-pagefind-body`，Pagefind 会只索引带有该属性的页面内容。没有这个属性的页面不会进入索引，因此首页、专题页、工具页如果也需要搜索，需要同样加上该属性。

## 忽略局部内容

如果正文里有一小块不希望被索引，可以使用 `data-pagefind-ignore`：

```html
<main data-pagefind-body>
  <h1>部署指南</h1>
  <p>这段正文会被索引。</p>

  <div data-pagefind-ignore>
    这里是重复的推荐阅读，不进入搜索索引。
  </div>
</main>
```

默认忽略正文索引，但仍可能处理其中的元数据。要完全排除一个元素及其子元素，可写成：

```html
<div data-pagefind-ignore="all">
  这里不会被 Pagefind 用于正文、标题、元数据或筛选。
</div>
```

## 使用 root selector

CLI 的 `--root-selector` 可以限制 Pagefind 处理页面的根节点：

```bash
pagefind --site dist --root-selector main
```

它会让 Pagefind 只处理 `main` 元素以内的内容。需要注意：`root selector` 之外的元数据和筛选也不会被检测到。大多数项目优先使用 `data-pagefind-body`，只有在模板非常统一时再使用 `--root-selector`。

## 保留特殊字符

默认索引会去掉多数标点。技术文档如果需要搜索 `<head>`、`$PATH`、`C++` 这类内容，可以配置 `include_characters`：

```yaml
include_characters: "<>+$"
```

这类配置推荐写进 `pagefind.yml`，避免命令行转义在不同 shell 中表现不一致。
