Pattern 一句話

Build time 為每種 filter mode 各建一份獨立 source / index、runtime 切換 mode 等於切 source。

對應 #59 Filter × Source 合成策略 的策略 C。


何時用、何時不用

  • 能控 source 的 build pipeline(自家 build、不是第三方 API)
  • Filter mode 數量有限且穩定(< 5 個、不會爆炸組合)
  • 兩個(含以上)mode 都重要、流量大、值得獨立 index
  • Source 的 query 引擎不支援該 filter(不能用 #61 推進 query)

不用

  • Filter 維度多、組合會爆炸(5 維 × 各 5 選項 = 3125 種 index)
  • Index 大小敏感(每份 index 都重複占空間)
  • Build pipeline 無法控(外部 API、vendor service)
  • Mode 不穩定、常常增刪

結構

Build pipeline

1# Pagefind 範例:兩份 index 各自掃不同 region
2pagefind --site public --output-subdir _pagefind-all
3pagefind --site public/title-only --output-subdir _pagefind-title
4
5# 或用 --root-selector 限定 source 範圍
6pagefind --site public --root-selector ".post-title" --output-subdir _pagefind-title

Runtime 切換

1const indexes = {
2  all: await import('/_pagefind-all/pagefind.js'),
3  title: await import('/_pagefind-title/pagefind.js'),
4};
5
6function search(query, mode) {
7  return indexes[mode].search(query);
8}

每個 mode 對應一份完整 index、search 結果直接是該 mode 的全集。沒有 post-filter、沒有層錯位


多 index 的成本

成本面影響
Build 時間每份 index 各建、線性增加
儲存空間每份各自占用(pagefind 約 site 大小 2-5%)
載入頻寬runtime 載入哪份 = 該 mode 的 size
維護改 source / schema 時、所有 index 都要重 build

通常 build / 儲存的成本 < 在 runtime 自動續抓(B)的累積請求成本。


跟 #59 策略並用

C 通常跟其他策略並用:

  • C + 推進 query (A):在每份 index 內、再用 query filter 細分(如 _pagefind-post.search('css', { filters: { tag: 'js' } })
  • C 切 mode + B 自動續抓:mode 切換無感、mode 內續抓也無感

反例

反例 1:Mode 組合爆炸

1# 5 維 × 各 5 選項 = 3125 份 index
2for type in post page tutorial faq doc; do
3  for tag in js css html ts py; do
4    for date in 2020 2021 2022 2023 2024; do
5      pagefind --filter "type=$type tag=$tag date=$date" --output-subdir _pagefind-$type-$tag-$date
6    done
7  done
8done

組合爆炸時不能用 C — 改用 A(推進 query)讓 source 一份就好。

反例 2:Mode 不穩定、常常增減

每加一個 mode、build pipeline 多一份、deploy 多一份。如果 mode 半年內會大改、不適合 C。

反例 3:Index 沒對齊 mode

1pagefind --site public --output-subdir _pagefind-title
2# build 完後沒過濾、其實 index 了 title + content 全部

如果只是改 output 路徑、沒改 index 範圍 → 兩份 index 內容一樣、白做。要用 --root-selectordata-pagefind-body 標記正確範圍。


跟其他 Pattern 的關係

選擇順序:A → C → B → D(見 #61):

  • A 不行(source 不支援該 filter) → 評估 C
  • C 不行(mode 爆炸 / 不能控 build) → 退到 B
  • B 不行(match 稀疏會爆) → 退到 D

C 是 A 的 build-time 模擬 — 用 build 時間換 runtime 體驗、跟使用者意圖完全對齊(每份 index = 該 mode 的全集)。


判讀徵兆

訊號該做的事
Source 不支援該 filter、想用 A 但做不到評估能不能控 build → 是 → C
Mode 數量 < 5、stable、能控 build用本 pattern
Mode 組合會爆炸(多維 × 多選)不要用 C、考慮 A 或重新思考 mode 設計
兩份 index 內容一樣(沒對齊 mode)Build pipeline 出錯、檢查 source 過濾
Build 時間翻倍但 runtime 體驗沒改善重評估:是否值得多份 index

核心原則:C 用 build-time 換 runtime 體驗。前提是 mode 有限、可控、值得 — 否則退到 A 或 B。