# 支援的檔案格式

watcher 會索引哪些檔案、略過哪些檔案，以及各格式如何切成可搜尋的 chunk（切塊）。

## 依副檔名分派

副檔名以小寫比對（`internal/filesystem/walkFiles.go`）。

| 副檔名 | Parser | 切塊單位 | 紀錄的 `kind` |
|---|---|---|---|
| `.pdf` | `pdftotext -layout -enc UTF-8`，移除換頁字元 | 段落 | `pdf` |
| `.docx` | 本文，接著頁首、頁尾、註腳、章節附註 | 段落 | `docx` |
| `.pptx` | 投影片 XML 文字，依投影片編號排序 | 每張非空白投影片一個 chunk | `pptx` |
| `.csv`、`.tsv` | CSV reader（`.tsv` 以 tab 分隔），去除 UTF-8 BOM | 32 列資料 | `csv` |
| `.xlsx` | 僅第一個工作表 | 32 列資料 | `xlsx` |
| 其他副檔名 | 通過文字檢查時當純文字讀取 | 段落 | `text` |

## 段落切塊

PDF、DOCX 與純文字檔的內容以空白行切分；只含空格或 tab 的行也視為空白行。每個段落去除前後空白、捨棄空段落，其餘段落從 1 開始編號，並一併記錄總數。段落內的行保留原本的換行。

```text
Alpha Go notes
line two

Second paragraph about SQLite
```

這份檔案產生兩個 chunk：chunk 1 是前兩行並保留其間的換行，chunk 2 是最後一行。

## 表格切塊

CSV、TSV 與 XLSX 以第一列為表頭。資料列每 32 列組成一個 chunk，每列獨立一行，格式為 `[列號] 表頭=值, ...`，列號從 1 起算：

```text
[1] name=ann, role=dev
[2] name=bob, role=ops
```

| 情況 | 行為 |
|---|---|
| 表頭儲存格為空 | 鍵名改為 `col<N>` |
| 資料列儲存格多於表頭 | 多出的儲存格捨棄 |
| 只有表頭列，或檔案為空 | 不產生 chunk；該檔先前的資料列會被 dismiss |
| CSV 或 TSV 大於 1 MiB | Parser 錯誤，檔案不會被儲存 |

## 略過的檔案

| 規則 | 範例 |
|---|---|
| 排除的檔名 | `.DS_Store` |
| 二進位副檔名 | 圖片（`.png`、`.jpg`、`.heic`、`.svg`）、影片（`.mp4`、`.mov`）、音訊（`.mp3`、`.wav`）、壓縮檔（`.zip`、`.tar`、`.gz`）、執行檔與函式庫（`.exe`、`.so`、`.dylib`）、安裝檔（`.dmg`、`.deb`）、bytecode（`.class`、`.jar`、`.pyc`、`.wasm`）、資料庫（`.db`、`.sqlite`）、設計檔（`.psd`、`.fig`）、字型（`.ttf`、`.woff2`） |
| 未通過文字檢查 | 前 8 KiB 含 NUL 位元組或不是合法 UTF-8，或檔案為空 |

略過的檔案仍會記進快照，在檔案變動前不會重新檢查。

## 相關頁面

- [索引流程](/zh/indexing-pipeline)
- [關鍵字搜尋](/zh/keyword-search)
