/notes/plugin/custom-search-readme_full
---
date: 2026-05-13 19:02
updated: 2026-06-01 18:20
---
ᅟ<span class="date">Updated: 2026-06-01 18:20</span>
# 📋 Custom Search Plugin for Obsidian
**custom-search** 是一款 Obsidian 搜索增強插件,無需建立索引(原生索引會引起延遲),即時搜索,適合需要在大規模筆記庫(數千至數萬文件)中進行精準、高效搜索的用戶。它支持**正則表達式**、**文件範圍自定義**、**文件組/組合管理**、**結果排序**以及**多種結果展示模式**等功能,並將搜索結果顯示在**右側邊欄**,方便快速瀏覽和跳轉。
- 原生搜索 = 每次都在整座圖書館裡檢索,館越大越慢。
- Custom Search = 先把幾本書拿到桌上,只在這幾本裡翻。保持渲染。
此外,插件還提供了**手寫搜索查詢**功能,支持完整的 Obsidian 原生搜索語法,通過**輔助編輯器**進行可視化構建查詢。
https://github.com/arpcn/obsidian-custom-search
## 📑 目錄
- [快速開始](#🚀.快速開始)
- [搜索方式](#🔍.搜索方式)
- [特殊搜索模式](#🔧.特殊搜索模式)
- [管理文件組/組合](#📁.管理文件組/組合)
- [結果面板](#🖱️.結果面板)
- [命令列表](#📖.命令列表)
- [設置說明](#⚙️.設置說明)
- [正則表達式提示](#💡.正則表達式提示)
- [常見問題](#❓.常見問題)
- [技術說明](#🔧.技術說明)
- [更新日誌](#📝.更新日誌)
- [Custom-Search vs Obsidian原生搜索 對比](#📊.Custom-Search.vs.Obsidian原生搜索.對比)
---
## ✨ 主要功能一覽
| 功能類別 | 具體功能 |
| :------- | :------------------------------- |
| 🔍 搜索方式 | 預定範圍搜索、自定義範圍搜索、原生搜索查詢 |
| 📁 範圍管理 | 文件組、組合、默認預定範圍、 |
| 📊 結果顯示 | 三種顯示模式(單行/3行滾動/展開)、條目獨立控制、文件批量控制、分頁加載、折疊/展開 |
| 📈 結果排序 | 文件優先級、組間優先級、組內模式優先級 |
| 🎨 界面自定義 | 顏色自定義(文件名、匹配行、關鍵詞、懸停、模式按鈕、序號文字等) |
| ✍️ 手寫查詢 | Obsidian 搜索語法支持、輔助編輯器、表單可視化 |
| ⌨️ 快捷操作 | 鍵盤導航、右鍵菜單集成、長按歷史菜單 |
![[custom-search.png|400]]
---
## 🚀 快速開始
### 安裝
1. 下載本項目的 `main.js` 和 `manifest.json` 文件。
2. 在 Obsidian 庫的 `.obsidian/plugins/` 目錄下,創建一個名為 `custom-search` 的文件夾。
3. 將下載的兩個文件放入 `custom-search` 文件夾中。
4. 在 Obsidian 中,進入 `設置` → `第三方插件`,**禁用安全模式**。
5. 在已安裝插件列表中,啟用 `Custom Search` 插件。
### 基本使用流程
1. **打開搜索面板** — 使用命令或右鍵菜單,選擇`搜索面板`
2. **輸入搜索內容** — 手動輸入,或從歷史下拉中選擇(有選中文本時會自動填入)
3. **選擇範圍** — 使用預定範圍,或自定義正則(可加載已有文件組)
4. **執行搜索** — 結果顯示在右側邊欄
5. **點擊跳轉** — 點擊結果跳轉(Ctrl+點擊在新標籤頁打開)
> 💡 **快速搜索**:選中文本後使用右鍵`預設範圍快搜`,一鍵執行。
---
## 🔍 搜索方式
### 方式一:預定範圍搜索
使用預設的文件模式進行快速搜索。
- 「初始默認預定範圍」可在設置中配置
- 可將文件組或組合設為「臨時默認預定範圍」,設置後「預定範圍」按鈕會顯示 ⭐ 標記
- 適用於經常在固定範圍內搜索的場景
- 點擊「預定(原生)」按鈕可轉為 Obsidian 原生搜索
### 方式二:自定義範圍搜索
手動指定文件名匹配模式,在匹配的文件中搜索內容。
- **文件名匹配**:單行輸入框支持多行模式(點擊後自動展開),每行一個正則表達式,支持包含/排除規則
- **內容搜索**:支持普通文本或正則表達式(自動檢測 `+*?|()[]{}` 字符)
- **排除規則**:以 `!` 開頭的行表示排除匹配該模式的文件(支持轉義 `\!` 匹配字面感嘆號)
- **修改版標記**:如果應用了文件組/組合後又修改了編輯區內容,按鈕會顯示「已修改」標記
- 點擊「自定義(原生)」按鈕可轉為 Obsidian 原生搜索
#### 包含/排除規則示例
```
# 包含規則(正常匹配)
^(集異門|法蘊|品類|識身)足論\.md
(婆沙|正理|本義抄)\d+-\d+\.md
# 排除規則(以 ! 開頭)
!.+疏22\.md
!^vibhasa\/others\/
!.*甘露味.*\.md
```
插件支持四種搜索模式:
- **包含模式** (`include-only`):只匹配包含規則的文件
- **排除模式** (`exclude-only`):從所有文件中排除匹配排除規則的文件
- **排除優先** (`exclude-first`):先排除,再選取包含
- **包含優先** (`exclude-last`):先選取包含,再從中排除
包含/排除模式自動檢測邏輯
| 模式 | 條件 | 行為 |
|:---|:---|:---|
| `include-only` | 只有包含規則 | 只匹配包含規則的文件 |
| `exclude-only` | 只有排除規則 | 從所有文件中排除匹配排除規則的文件 |
| `exclude-first` | 有包含規則,且第一個包含行之前有排除行 | 先排除,再選取包含 |
| `exclude-last` | 有包含規則,且第一個包含行之後有排除行 | 先選取包含,再從中排除 |
> 💡 **提示**:排除行(以 `!` 開頭)建議統一放在所有包含行的**最前面**(先排除後包含)或**最後面**(先包含後排除),以確保過濾順序符合預期。
### 方式三:原生搜索查詢
- 前兩種方式均可自動轉換成**原生搜索**,填入 Obsidian 搜索框並自動執行搜索。
- **手寫模式**:直接編寫 Obsidian 原生搜索語法,利用 Obsidian 內置的搜索功能。
- **輔助編輯器**:可視化構建查詢,無需記憶複雜語法。
原生搜索適用場景:
- 使用複雜的搜索條件組合(AND/OR/NOT)
- 搜索特定類型的內容(任務、區塊、章節等)
### 三種方式對比
| 方式 | 優點 | 適用場景 |
|:---|:---|:---|
| 預定範圍 | 快速、配置固定 | 日常頻繁使用的搜索範圍 |
| 自定義範圍 | 靈活、精準控制 | 臨時需要調整搜索範圍 |
| 原生搜索 | 功能最強大 | 複雜條件組合搜索 |
---
## 🔧 特殊搜索模式
在「搜索面板」對話框內容搜索中,提供了三個輔助搜索模式開關,可根據需要靈活組合使用。
💡 ①布爾模式:空格 & = AND;ᅠ | = OR;ᅠ ! = NOT;ᅠ ( ) = 分組\n\n
💡 ②無視標籤:忽略 HTML 標籤、MD語法及標點符號
💡 ③忽略變音:忽略九組變音符號(a/ā/â等)
📖 ④正則模式:標識 * + ? $ { } \ [ ]
🚫 注意:①②④ 三者互斥,①③互斥
### 布爾查詢
啟用後,搜索內容支持簡潔的邏輯運算符語法:
```
佛性 & 眾生 # 空格 或 & → AND 包含「佛性」且包含「如來藏」
佛性 | 如來藏 # | → OR 包含「佛性」或「如來藏」
佛性 !外道 # ! → NOT 包含「佛性」但不包含「外道」
(佛性|如來藏) 眾生 # ( ) → 分組 包含(佛性或如來藏)且包含「眾生」
```
**注意事項**:
> ⚠️ 與原生搜索不同:原生用空格表示 OR,本插件空格表示 AND
- 💡 此功能僅在「普通文本模式」下生效(未勾選無視標籤、忽略變音,且搜索內容不包含正則特殊字符)
### 無視標籤
啟用「無視標籤」後,插件會自動忽略 HTML 標籤、MD語法和標點符號,實現跨標籤的文本匹配。
| 功能維度 | Custom Search | 其他搜索插件 (Omnisearch, Clever 等) |
| ----------- | --------------------------------------------------- | ------------------------------------------------------------ |
| **處理機制** | **預處理**(先解析 Markdown/HTML,提取純文字,再比對) | **分詞/模糊匹配**(在帶有符號的原文上進行模糊比對) |
| **HTML 標籤** | ✅ **完整跳過**(如 `<font color="red">重要</font>` -> `重要`) | ❌ 視為普通字元或無法處理 [](https://forum-zh.obsidian.md/t/topic/52938) |
| **精確比對** | ✅ **精確**(刪除標籤後,必須字字匹配) | ❌ **模糊**(只能透過相似度「猜測」,可能誤判) |
**使用場景**:
- 筆記中包含 HTML 標籤(如 `<b>`、`<i>`、`<span>` 等)、MD語法(如 `~*_=[]!()^ 等),希望忽略這些標籤直接匹配文本內容
- 文本中包含標點符號(如逗號、句號、頓號等),希望忽略符號差異進行匹配
**工作原理**:
在搜索關鍵詞的每個字符之間,自動插入 `(?:<[^>]*>|\p{P}|\p{S}|\p{Zs}){0,3}` 模式,最多允許跳過 3 個標籤或標點符號。
**示例**:
```
原文:佛<b>即</b>知,子曹疑
搜索:佛即知子曹疑
結果:✅ 匹配成功(`<b>` 和 `,` 被忽略)
```
**注意事項**:
- 💡 此功能僅在「普通文本模式」下生效(未勾選布爾查詢,且搜索內容不包含正則特殊字符)
### 忽略變音
啟用「忽略變音」後,插件會自動處理帶變音符號的字符,實現忽略變音符號(diacritics)的匹配。
- 💡 原生搜索中並沒無有效的`diacritics`語法。
**支持的字符家族**:
| 家族 | 互換字符 |
| :--- | :--- |
| a 家族 | a, ā, â |
| i 家族 | i, ī, î |
| u 家族 | u, ū, û |
| s 家族 | s, ṣ, ś |
| t 家族 | t, ṭ |
| d 家族 | d, ḍ |
| n 家族 | n, ṇ, ñ, ṅ |
| m 家族 | m, ṃ |
| h 家族 | h, ḥ |
**示例**:
```
原文:śūnyatā(空性)
搜索:sunyata
結果:✅ 匹配成功(ś→s, ū→u, tā→ta)
```
**注意事項**:
- ✅ 同時支持正則模式和普通文本模式
- ✅ 與「無視標籤」可以同時啟用
- 💡 此功能與「布爾查詢」互斥
### 互斥關係說明
「無視標籤」「布爾查詢」「正則模式」三者互斥。
「忽略變音」可以與「正則模式」共用,也可以與「無視標籤」共用。
「忽略變音」與「布爾查詢」互斥。(如果「忽略變音」與「布爾查詢」同時使用,在「前瞻斷言」和「零寬斷言」這類語法中應用「忽略變音」轉換,搜索結果的高亮,沒法直接顯示。所以需要加互斥邏輯。)
互斥矩陣是:
| 模式1 | 模式2 | 是否兼容 |
| ---- | ---- | ---- |
| 布爾查詢 | 無視標籤 | ❌ 互斥 |
| 布爾查詢 | 忽略變音 | ❌ 互斥 |
| 布爾查詢 | 正則模式 | ❌ 互斥 |
| 無視標籤 | 正則模式 | ❌ 互斥 |
| 無視標籤 | 忽略變音 | ✅ 兼容 |
| 正則模式 | 忽略變音 | ✅ 兼容 |
根據上述規則,可以同時使用的功能組合是:
| 組合 | 布爾查詢 | 無視標籤 | 忽略變音 | 正則模式 |
| --- | ---- | ---- | ---- | ---- |
| 1 | ✅ | ❌ | ❌ | ❌ |
| 2 | ❌ | ✅ | ❌ | ❌ |
| 3 | ❌ | ❌ | ✅ | ❌ |
| 4 | ❌ | ❌ | ❌ | ✅ |
| 5 | ❌ | ✅ | ✅ | ❌ |
| 6 | ❌ | ❌ | ✅ | ✅ |
---
## 📁 管理文件組/組合
![[2026-04-30-1552.png|600]]
### 文件組 (Group)
由多個正則表達式模式組成的集合,支持包含/排除規則。
```
# 示例:俱舍論相關文件組
(俱舍論|AKBh)\d+\.md
^kosa\/ju\/
俱舍論記疏\d+\.md
!.+疏22\.md # 排除包含「疏22」的文件
```
操作:
- 創建/刪除文件組
- 編輯組內正則模式(每行一個,支持註釋 `#`,支持排除規則 `!`)
- 點擊組標題可折疊/展開
### 組合 (Combination)
將多個文件組組合成一個更大的範圍。
操作:
- 創建/刪除組合
- 從文件組列表中選擇添加到組合
- 已加入的組以標籤形式顯示,支持單獨移除
### 應用選項
| 選項 | 功能 |
|:---|:---|
| ⭐ 設為臨時默認預定範圍 | 將選中的文件組/組合作為臨時默認搜索範圍 |
| 🗑️ 清除臨時默認 | 清除已保存的臨時默認預定範圍,恢復初始設置 |
| 🔍 應用為自定義範圍(本次搜索) | 將模式填充到主窗口編輯區,並顯示「📌」標記(可繼續微調) |
| ✍️ 寫入手寫搜索查詢區 | 生成 Obsidian 原生搜索查詢語法,自動填入「手寫搜索查詢」對話框 |
⭐將任意文件組或組合設為臨時默認預定範圍後:
- 「快速預設範圍搜索」命令直接使用此範圍
- 「搜索面板」中的「預定範圍」選項使用此範圍,並顯示 ⭐ 標記
- 點擊「清除臨時默認」可恢復使用「初始默認預定範圍」
---
#### ✍️ 手寫搜索查詢對話框
提供兩種編輯模式:
##### 手動編輯模式
直接編寫 Obsidian 原生搜索語法。
支持的語法示例:
```
line:(佛即知子曹疑) file:/義足經/
line:/為顯自師[,\.]?其體尊高.*故先讚德/ path:^kosa/ju/
(tag:#哲學) (file:思考筆記.md)
```
##### 輔助編輯模式
通過表單可視化構建搜索查詢:
- **搜索類型**:all / file / path / tag / content / line / block / section / task / task-todo / task-done
- **搜索內容**:輸入關鍵詞或正則表達式
- **邏輯運算符**:AND / OR / NOT(第一行無運算符)
- **修飾符**:
- 🔤 大小寫敏感(match-case)
- ◌̈ 區分變音符號(diacritics)(實測無用)
- .* 正則表達式(regex)
- **快捷填充**:點擊類型旁的圖標 📁,可從 vault 中選擇文件/標籤/路徑快速填入
- **生成查詢**:點擊「✍️ 轉入編輯」將生成的查詢語法填入手動編輯區
- **重置表單**:清空所有條件,恢復初始狀態
### 預定範圍標籤頁
設置插件的「初始默認預定範圍」文件模式。這是「快速預設範圍搜索」和「預定範圍」按鈕的基礎範圍。
---
## 🖱️ 結果面板
### 基本操作
| 操作 | 效果 |
|:---|:---|
| 點擊結果行 | 跳轉到對應文件的行,並高亮選中關鍵詞 |
| `Ctrl` + 點擊 | 在新標籤頁打開 |
| 點擊左側序號 | 循環切換該條目顯示模式(A→B→C→A) |
| 全局 A/B/C 按鈕 | 切換所有結果的默認顯示模式 |
| Top 按鈕 | 滾動到面板頂部 |
| ⟳ 刷新按鈕 | 直接重新執行當前搜索,不打開對話框,不保存歷史 |
| 重新搜索按鈕 | 打開搜索對話框,載入當前搜索設置,可修改後重新搜索 |
### ⌨️ 鍵盤導航
在結果面板獲得焦點時,可以使用以下快捷鍵:
| 快捷鍵 | 功能 |
| :------------------ | :------------ |
| `↑` / `↓` | 選擇上一個/下一個搜索結果(支持循環) |
| `Enter` | 跳轉到當前選中的結果 |
| `Home` / `End` | 跳轉到第一個/最後一個結果 |
| `Escape` | 清除當前選中結果的焦點,將焦點轉移到面板容器 |
| `Ctrl+←` / `Ctrl+→` | 切換上一條/下一條搜索歷史 |
| `Ctrl+\` | 顯示搜索歷史列表(快捷鍵方式) |
> 💡 提示:點擊結果面板任意位置後即可使用鍵盤導航;按 Escape 可將焦點轉移到面板容器。
### 📊 搜索結果顯示(三種模式)
| 模式 | 顯示方式 | 適用場景 |
|:---|:---|:---|
| **A (單行)** | 只顯示匹配行,動態截取適應面板寬度 | 快速瀏覽,節省空間 |
| **B (3行+滾動)** | 顯示匹配行及其前後各一行,固定高度 | 需要上下文參考 |
| **C (展開)** | 顯示匹配行及其前後各一行,完全展開 | 需要完整上下文 |
| 切換操作 | 效果 |
| :------------------- | :--------------------------- |
| 點擊頂部 A/B/C 按鈕 | 全局切換,一次性設置所有結果的默認顯示模式 |
| 懸浮文件頭「«」按鈕 → 選 A/B/C | 批量設置當前文件下所有結果的模式 |
| 點擊每個結果左側的序號 | 獨立切換該條目的模式(循環:A → B → C → A) |
### 📄 文件折疊
當搜索結果較多時,可以折疊不需要查看的文件,專注於感興趣的內容。
| 操作 | 效果 |
|:---|:---|
| 點擊文件頭右側的 `▼` / `▶` 按鈕 | 折疊/展開該文件下的所有搜索結果 |
| 點擊頂部工具欄的 `▶` 按鈕(全部折疊) | 折疊所有已加載文件的結果 |
| 點擊頂部工具欄的 `▼` 按鈕(全部展開) | 展開所有已加載文件的結果 |
折疊狀態會自動保存,重新搜索或刷新面板後仍會保持。
> 💡 提示:折疊後的文件仍然會佔用已加載數量統計,但不會顯示在面板中,頂部統計欄會顯示折疊條數。
### 📦 分頁加載
為提升大量搜索結果(數千條)時的渲染性能,插件採用分批加載策略:
| 顯示模式 | 每批加載數量 |
|:---|:---|
| A 模式(單行) | 100 條 |
| B 模式(3行+滾動) | 40 條 |
| C 模式(展開) | 40 條 |
- **首次加載**:只加載第一批結果,快速響應
- **加載更多**:滾動到底部,點擊「➕ 加載更多」按鈕,按順序加載下一批結果
- **自動擴展**:新加載的文件如尚未在面板中,會自動創建對應的文件區域
- **動態調整**:切換全局模式時,批次大小會自動調整(如從 C 模式切換到 A 模式,批次從 40 增加到 100)
頂部統計欄會實時顯示當前加載狀態:`已加載數/總結果數`,如有折疊文件會額外顯示 `(折疊X條)`。
### 📜 搜索歷史
插件會自動保存每次主動搜索的記錄,方便回溯和重複使用。
#### 圖形化操作
| 操作 | 說明 |
| :----------- | :------------ |
| 點擊 `❮` / `❯` | 切換上一條/下一條搜索歷史 |
| 長按 `❮` / `❯` | 顯示歷史列表面板(長按 300ms) |
| 點擊歷史列表中的條目 | 加載該歷史並重新搜索 |
| 點擊歷史列表中的 `✕` | 刪除該條歷史記錄 |
| 點擊「清除所有歷史」 | 清空全部搜索歷史 |
| 鍵盤導航(歷史面板內) | `↑`/`↓` 選擇,`Enter` 加載,`Escape` 關閉 |
#### 快捷鍵操作
| 快捷鍵 | 功能 |
| :-------- | :---------- |
| `Ctrl+←` | 上一條搜索歷史(更舊) |
| `Ctrl+→` | 下一條搜索歷史(更新) |
| `Ctrl+\` | 顯示歷史列表面板 |
#### 歷史面板功能
- 半透明毛玻璃效果背景
- 顯示當前位置(如 `(2/10)`)
- 當前激活條目高亮顯示
- 支持鍵盤導航(`↑`/`↓` 移動,`Enter` 加載)
- 鼠標懸停時自動退出鍵盤導航模式
---
## 📖 命令列表
| 命令名稱 | 右鍵菜單 | 說明 |
|:---|:---|:---|
| 搜索面板 | ✅ | 打開完整的搜索模式選擇對話框 |
| 快速預設範圍搜索 | ✅ | 使用默認預定範圍直接執行搜索 |
| 打開結果面板 | ❌ | 打開或聚焦到右側的搜索結果面板 |
| 管理文件組/組合 | ❌ | 打開文件組和組合的管理界面 |
---
## ⚙️ 設置說明
打開設置 → custom-search 插件,共有 5 個選項卡:
![[2026-04-30-1411.png|600]]
---
### 1. 搜索設置
| 設置項 | 說明 |
|:---|:---|
| 默認顯示模式 | A(單行)或 B(3行+滾動)或 C(展開) |
| 布爾查詢(默認值) | 全局默認是否開啟布爾查詢模式 |
| 無視標籤(默認值) | 全局默認是否開啟無視標籤模式 |
| 忽略變音(默認值) | 全局默認是否開啟忽略變音模式 |
**默認搜索範圍(初始預定範圍)**
設置「快速預設範圍搜索」使用的初始預定文件名模式,每行一個正則表達式。支持註釋行(`#` 開頭)。
---
#### 字符寬度自定義設置
用於 A 模式(單行)的動態文本截取,讓用戶自定義哪些字符視為「窄字符」或「零寬度字符」。
| 設置項 | 說明 |
| :--- | :--- |
| 窄字符(每個字符折算 0.2 單位) | 每行一個 Unicode 碼位或範圍(如 `0x0F08` 或 `0x0F0B-0x0F0D`) |
| 零寬度字符(不計寬度) | 每行一個 Unicode 碼位或範圍,這些字符在計算寬度時完全跳過 |
**支持格式**:
- 單個碼位:`0x0F08`
- 碼位範圍:`0x0F0B-0x0F0D`
**使用場景**:
- 藏文等複雜文本的組合字符(如 `0x0F71-0x0F7E` 藏文元音符號、疊加字符等)
- 特殊標點符號(如 ༈ ་ ། 等)
- 梵文天城體中的休止符(्)等
**默認配置**:
- 窄字符:藏文分隔符、特殊標點等
- 零寬度字符:藏文元音符號、天城體休止符等
> 💡 如果 A 模式下的文本截取出現異常(如字符顯示不全或留有大量空白),可以通過此設置調整字符寬度計算規則。
---
### 2. 優先級設置
啟用排序後,搜索結果按以下優先級排列:
| 優先級 | 名稱 | 說明 |
|:---|:---|:---|
| 1 | 文件優先級 | 匹配正則的文件/路徑優先顯示(按行順序) |
| 2 | 文件組間優先級 | 拖拽調整組的顯示順序(越靠上越優先) |
| 3 | 文件組內模式優先級 | 調整組內正則行的匹配順序(越靠上越優先) |
| 4 | 默認順序 | 行號、文件名等 |
#### 文件優先級示例
```
# 優先顯示這些路徑/文件
^kosa\/ju\/
^重要/
核心概念\.md
# 次優先顯示
^nofa\/ji\/
參考資料\.md
```
#### 組間優先級
在設置頁面中,通過拖拽左側 `⋮⋮` 按鈕調整文件組的顯示順序(點擊 ↑/↓ 按鈕調整)。
#### 組內模式優先級
展開每個文件組,拖拽調整正則行的順序(點擊 ↑/↓ 按鈕調整),匹配順序會影響結果顯示。點擊「重置該組順序」可恢復為默認順序。
#### 保存與重置
- **💾 保存排序設置到文件組**:將當前的文件組間順序和組內模式順序寫入文件組的初始順序(會修改 `data.json` 中的模式排列)
- **🔄 重置所有排序設置**:清空所有排序配置,恢復默認狀態(文件組初始順序不變,需重新保存排序才能固化)
- **📁 管理文件組/組合**:快速跳轉到文件組管理界面
### 3. 歷史管理
| 設置項 | 說明 |
|:---|:---|
| 最大保存歷史數 | 設置歷史記錄上限(1-100),超出時自動截斷 |
| 歷史面板寬度 | 設置歷史列表彈窗寬度(200-600px) |
| 清除所有歷史 | 清空全部歷史記錄,重置當前索引為 -1 |
| 歷史列表 | 顯示所有歷史條目(搜索文本預覽 + 範圍顯示),支持單獨刪除 |
### 4. 顏色外觀
所有顏色均支持 RGBA 格式(紅、綠、藍、透明度),提供多種配置方式:
- **顏色選擇器**:直觀選取顏色(十六進制)
- **透明度滑塊**:調整透明程度(0-100%)
- **手動輸入框**:直接輸入 `rgba(r, g, b, a)` 或 `#RRGGBB` 格式,錯誤時恢復原值
- **實時預覽**:色塊實時顯示當前顏色
- **實時生效**:修改後立即刷新結果面板
#### 可自定義的顏色項
| 類別 | 顏色項 | 說明 |
|:---|:---|:---|
| 基礎顏色 | 文件名顏色 | 搜索結果中文件名的顏色 |
| | 匹配行背景色 | 匹配行的背景顏色(B/C 模式) |
| | 關鍵詞高亮背景色 | 搜索關鍵詞的高亮背景顏色 |
| | 懸停背景色 | 鼠標懸停時的行背景顏色 |
| 模式按鈕 | 模式 A/B/C 按鈕顏色 | 三種模式的按鈕背景色 |
| | 激活模式外框顏色 | 當前激活的全局模式按鈕的外框顏色 |
| 序號文字 | A/B/C 模式序號文字顏色 | 每種模式下序號數字的文字顏色 |
點擊「重置所有顏色為默認值」可恢復所有顏色設置。
### 5. 說明
顯示插件命令列表(含右鍵菜單標記)和正則表達式提示。
---
## 💡 正則表達式提示
正則模式,帶標識:`* + ? $ { } \ [ ]`
### 基本規則
| 規則 | 說明 |
|:---|:---|
| `\d` | 匹配數字 |
| `\d+` | 匹配一個或多個數字 |
| `\.` | 匹配點號(需要轉義) |
| `(A\|B)` | 匹配 A 或 B |
| `^` | 匹配開頭 |
| `$` | 匹配結尾 |
| `\/` | 匹配路徑分隔符(需要轉義) |
### 路徑匹配注意事項
在 Obsidian 中匹配路徑時,正則表達式中的 `/` 需要轉義為 `\/`:
```
✅ 正確:^kosa\/ju\/
❌ 錯誤:^kosa/ju/
```
### 排除規則
以 `!` 開頭的行表示排除匹配該模式的文件:
```
!.+疏22\.md # 排除文件名包含「疏22」的文件
!^vibhasa\/others\/ # 排除 vibhasa/others/ 路徑下的文件
```
如需匹配以感嘆號開頭的模式,使用轉義 `\!`:
```
\!important # 匹配以「!important」開頭的內容
```
---
### 註釋與空白
#### 文件名匹配
- 以 `#` 開頭的行會被忽略,可用於添加說明
- 行首的空格和製表符會被自動忽略(`trim()` 處理),如需匹配開頭空格和製表符請使用 `\s` `\t`
```
# 阿含部經典
(長阿含|中阿含|雜阿含|增一阿含)\.md
# 論藏文獻
(大毘婆沙|順正理論|俱舍論)\.md
```
#### 內容搜索
內容搜索中,開頭空格、`#`、`^` 等字符都可以直接正常使用,無需特殊處理。
**普通文本模式**(未勾選「布爾查詢」時):
```
#普通文本
#定義區塊 ^block-id
#引用區塊 #^block-id
[[筆記#^block-id]]
[文字](網址#^block-id)
#標籤 #targ-id
```
**正則模式**(未勾選「布爾查詢」,且內容包含 `+*?${}()|[\]\\` 等符號時自動啟用):
```
#定義區塊
\s\^block-id
#引用區塊
#\^block-id
\[\[.*?#\^block-id\]\]
\[[^\]]+\]\([^\)]+#\^block-id\)
#標籤
#targ-id
```
> ⚠️ 注意:布爾查詢模式下,`+*?${}()|[\]\\` 等符號視為普通字符,不會觸發正則模式。
---
### 文件名模式示例
```
# 純文件名匹配
^(集異門|法蘊|品類|識身)足論\.md
(婆沙|正理|本義抄)\d+-\d+\.md
(心論雜心|AKBh)\d+\.md
^(甘露味論|入阿毘達磨論)\.md
俱舍論記疏\d+\.md
^俱舍論頌疏\d+-\.md
頌疏注釋對照.*\.md
俱舍所依阿含\.md
成實論\.md
陰持入經註?.md
# 路徑匹配
^kosa\/ju\/
^kosa\/ju\/俱舍.+\.md
^agama\/[^\/]+\.md
# 藏經編號
T22n1428_四分律\d+\.md
T30n1579_瑜伽師地論\d+\.md
T25n1509_大智度論\d+\.md
T44n1851_大乘義章\d+\.md
# 排除規則
!.+疏22\.md # 排除包含「疏22」的文件
!^vibhasa\/others\/ # 排除該路徑下的所有文件
```
---
## ❓ 常見問題
**Q: 搜索結果不顯示?**
A: 確保文件名模式匹配到了文件,且文件中包含搜索關鍵詞。檢查正則語法是否正確。可查看控制台是否有錯誤信息。
**Q: 正則表達式報錯?**
A: 檢查正則語法,注意路徑中的 `/` 需要轉義為 `\/`,特殊字符需要轉義。錯誤時會有通知提示具體原因。
**Q: 排序不生效?**
A: 檢查「啟用結果排序」是否已開啟,且已配置相應的優先級規則。注意「文件優先級」規則優先級最高,會使匹配文件成為「優先文件」,無視後續排序規則(組間優先級、組內模式優先級只對普通文件生效)。
**Q: 如何恢復默認設置?**
A: 在設置頁面「顏色外觀」標籤頁點擊「重置所有顏色為默認值」;在「優先級設置」標籤頁點擊「重置所有排序設置」;在「管理文件組/組合」中點擊「清除臨時默認」;在「搜索設置」中可手動重置默認文件模式。
**Q: 文件組/組合數據保存在哪裡?**
A: 保存在 Obsidian 插件文件夾下的 `data.json` 中。插件版本更新時(版本不匹配)會自動備份舊配置(文件名:`data.json.backup.v{舊版本號}.{時間戳}.json`),並重置為默認配置,彈窗提示備份路徑。
**Q: 結果面板中的鍵盤導航不起作用?**
A: 請確保先點擊結果面板區域(或按 Tab 鍵聚焦),使其獲得焦點,然後再使用方向鍵。檢查是否有其他元素搶佔了焦點。
**Q: 包含/排除規則如何工作?**
A: 插件根據規則的出現順序自動判斷模式:僅包含規則 (`include-only`)、僅排除規則 (`exclude-only`)、先排除後包含 (`exclude-first`)、先包含後排除 (`exclude-last`)。如果同時存在包含和排除規則,會根據第一個包含行之後是否有排除行來決定順序。
> 💡 提示:排除行(以 `!` 開頭)建議統一放在所有包含行的**最前面**(先排除後包含)或**最後面**(先包含後排除),以確保過濾順序符合預期。混亂排列可能導致意外的過濾結果。
---
## 🔧 技術說明
- **視圖重建優化**:`refreshDisplay()` 方法增加 `forceRebuild` 參數,模式切換時傳入 `true` 強制重建,寬度變化時傳入 `false`(默認),避免側邊欄折疊/展開時已加載的結果被清空
- **累積單位寬度計算**:A 模式使用一次遍歷構建累積單位數組,結合二分查找快速定位截取邊界,避免多次遍歷和窄字符重調邏輯,提升性能和精度
- **位置映射截取**:基於可見字符串計算截取邊界後,通過 `displayToOriginal` 映射表轉換為原始字符串位置,確保截取結果保留所有原始 Markdown 語法字符,僅在寬度計算時跳過不可見標記
- **A 模式可見字符串構建**:通過 `buildVisibleStringWithMapping()` 函數使用狀態機遍歷原始行內容,識別並跳過以下不可見元素:
- 白名單 HTML 標籤(`<b>`、`<i>`、`<a>`、`<span>` 等,不佔寬度)、HTML 註釋(`<!-- -->`)、MD 語法鏈接 URL 部分(`[text](url)` 中的 `(url)`)
- 自定義高亮標記(`==[` 和 `==\[` 開頭,`]==` 結尾)
- 同時建立原始字符與可見字符的位置映射關係,確保截取後保留完整原始語法
- **鏈接 URL 關鍵詞檢測與轉義**:在 `getContextLines()` 中調用 `escapeLinkIfKeywordInUrl()`,使用正則匹配 `[文本](url)` 結構,檢測 URL 是否包含搜索關鍵詞(支持普通文本、正則、布爾查詢三種模式),若包含則在 `[` 前添加 `\` 轉義,使鏈接以純文本形式顯示
- **不成對元素清理**:在 A 模式截取完成後,調用 `removeUnpairedTagsAndMarkers()` 函數清理截取結果中不成對的元素:
- 白名單 HTML 標籤:移除只有開始標籤沒有結束標籤(或反之)的孤立標籤
- 自定義高亮標記:移除只有 `==[`/`==\[` 沒有 `]==` 的開頭標記,以及單獨出現的 `]==` 結尾標記
- **刷新按鈕**:在結果面板統計信息欄右側提供 `⟳` 圖標按鈕,點擊後直接復用當前視圖中保存的所有搜索參數,調用 `searchAndShowInSidebar()` 重新執行搜索,`skipHistorySave` 設為 `true` 不保存到歷史記錄,不顯示 Notice 提示,實現快速刷新
- **無視標籤**:在普通文本模式的每個字符之間插入 `(?:<[^>]*>|\p{P}|\p{S}|\p{Zs}){0,6}` 模式,最多跳過 6 個標籤、MD語法或標點符號,實現跨標籤匹配
- **忽略變音**:將九組字符互轉為字符組正則,實現雙向匹配
- **互斥機制**:布爾查詢 ↔ 無視標籤 / 正則模式 ↔ 無視標籤 兩組互斥關係,通過 UI 狀態聯動和自動關閉實現
- **布爾查詢**:生成兼容的正則表達式
- **排除規則解析**:支持三種排除(純包含、純排除、先排除後包含、先包含後排除),以 `!` 開頭的行為排除規則,`\!` 轉義為字面感嘆號
- **歷史字段自動修復**:載入時檢查 `isBooleanQuery`、`enableDiacriticIgnore`、`enableHtmlTagIgnore`、`rangeRef` 等字段,缺失則補充默認值,並修正布爾模式與正則模式的衝突,確保舊版歷史記錄兼容性
- **搜索結果緩存**:在右側邊欄視圖中(`SearchResultView`)
- **動態測量**:動態測量面板寬度,基於字符寬度(包括零寬度字符等)自動調整單行模式的文本截取
- **Markdown 渲染**:使用 Obsidian 的 `MarkdownRenderer.renderMarkdown()` 渲染結果,支持格式保留
- **數據存儲**:文件組/組合數據、搜索歷史保存在 `.obsidian/plugins/custom-search/data.json` 中
- **原生搜索**:使用 `executeCommandById("search:search")` 代替模擬 Enter 事件,避免 `isTrusted: false` 導致的問題
- **正則路徑檢測**:自動檢測路徑匹配(包含 `/` 或 `\/` 時轉為 `path:` 查詢),添加括號以確保原生語法解析正確
- **結果排序器**:`ResultSorter` 支持三層優先級規則,只對普通文件應用 B/C 規則,優先文件(文件優先級匹配)不受後續排序規則影響
- **搜索歷史**:支持完全去重、最大數量限制、面板寬度可調、鍵盤導航
- **單行模式(A模式)**:自動轉義腳注行(以 `[^...]:` 開頭的行),自動刪除所有反引號以避免 Markdown 解析問題
- **自動調整高度**:文件組/組合編輯時自動調整文本域高度(自適應最大 300px)
- **懸浮模式按鈕**:使用延遲顯示/隱藏(200ms/250ms),避免誤觸發,背景為毛玻璃效果
---
## 📝 更新日誌
https://github.com/arpcn/obsidian-custom-search/blob/main/CHANGELOG.md
### [2.4.8] - 2026-06-01
#### 🐛 修復問題
- **修復「無視標籤」與「忽略變音」同時啟用時搜索無結果**
- 調整普通文本模式的處理順序:先刪除標點符號,再轉義正則特殊字符,然後應用忽略變音,最後插入標籤跳過模式
- 避免刪除標點步驟誤刪忽略變音生成的字符組方括號 `[ ]`
- **修復「重搜」載入文件組/組合時組名丟失**
- 在歷史恢復時正確設置 `pendingRangeInfo`,確保提交時能識別組名和修改狀態
- 優化提交邏輯,兼容來自歷史恢復的 `originalPatterns: null` 情況
### [2.4.7] - 2026-05-30
#### 🔧 優化改進
- **無視標籤模式增強**:加入空格匹配(半角/全角),搜尋時自動跳過空白字符
#### 🐛 修復問題
- **修復 A 模式截取時行首/行尾空格導致的渲染異常**
- **修復預定範圍保存後污染編輯區**:保存「初始預定範圍」後不再錯誤地寫入主對話框編輯區
- **修復「已修改」狀態下編輯區被意外覆蓋**:「已修改」狀態下保護用戶手動編輯,僅同步名稱變化
- **修復組合引用同步問題**:修改組合所引用的文件組後,返回主界面時編輯區內容正確同步(未修改狀態下)
- **修復打開設置頁面時 A 模式結果重複渲染**:添加防抖和防併發機制
### [2.4.6] - 2026-05-26
#### ✨ 新增功能
- **分頁加載**:結果分批加載,A/B/C 模式分別對應 100/40/40 條/批,提升大量結果時的渲染性能
- **文件折疊**:點擊文件頭右側按鈕或文件名,可折疊/展開單個文件的所有結果
- **全局折疊/展開**:頂部工具欄新增 ▶/▼ 按鈕,可批量控制所有文件的折疊狀態
- **加載更多**:底部按鈕按順序加載下一批結果,新文件區域自動創建
- **懶加載**:折疊的文件展開時才動態渲染條目,減少初始渲染開銷
#### 🔧 優化改進
- **模式切換邏輯重構**:引入強制重建參數,模式切換時正確刷新,寬度變化時按需重建
- **A 模式寬度變化精細化更新**:寬度變化時僅重新計算並更新每行的截取內容,不必重建整個視圖
- **選擇性渲染**:模式切換時,目標條目之前的文件只渲染文件頭,大幅減少渲染量
- **智能加載範圍**:模式切換後自動計算加載範圍,確保目標條目可見,同時控制性能開銷
- **跨模式位置記憶**:基於文件路徑和文件內偏移記錄位置,模式切換後準確恢復滾動位置
#### 🐛 修復問題
- 修復側邊欄折疊後重新打開時,結果被清空的問題
- 修復 B/C 模式下因寬度變化觸發的不必要視圖重建
### [2.4.5] - 2026-05-25
#### ✨ 新增功能
- A 模式支持跳過白名單 HTML 標籤(`<b>`、`<i>`、`<a>`、`<span>` 等),不計入寬度計算
- 支持自定義高亮標記 `==[`、`==\[` 和 `]==`,標記本身不計入寬度
- 截取後自動清理不成對的 HTML 標籤和自定義高亮標記,避免渲染異常
#### 🐛 修復問題
- 添加新文件組及組合時,實時刷新
- 修改文件組或預定範圍後,刷新按鈕和重新搜索按鈕現在會自動載入最新的範圍內容(從 settings 獲取)
- 在管理彈窗中修改當前主窗口引用的文件組/組合/預定範圍後,關閉彈窗時主對話框編輯區會自動更新為最新內容
#### 🔧 優化改進
- `buildVisibleStringWithMapping()` 採用狀態機架構,統一處理 HTML 標籤、註釋、鏈接 URL 和自定義標記
- 新增 `removeUnpairedTagsAndMarkers()` 函數,使用棧匹配算法清理不成對元素
- 組合的添加/刪除組成員操作現在會自動保存,與文件組的行為保持一致
### [2.4.2] - 2026-05-19
#### ✨ 新增功能
- A 模式(單行)支持跳過 Markdown 不可見語法標記(鏈接中的 URL 部分)(可選:`==`、`**`、`*`、`_`、`~~`)
- 鏈接 URL 包含搜索關鍵詞時自動轉義,使 URL 可見並支持高亮
- 結果面板新增「⟳ 刷新」按鈕,直接重新執行當前搜索(不彈窗、不保存歷史)
#### 🔧 優化改進
- A 模式截取算法重構:採用累積單位 + 二分查找,提升精度和性能
- 新增 `buildVisibleStringWithMapping()` 函數統一處理可見字符串構建與位置映射
- 新增 `escapeLinkIfKeywordInUrl()` 函數處理鏈接轉義邏輯
- 所有顯示模式(A/B/C)均支持鏈接 URL 關鍵詞檢測與轉義
### [2.4.1] - 2026-05-14
#### ✨ 新增功能
- 設置面板中新增「無視標簽(默認值)」和「忽略變音(默認值)」開關,支持三個開關的互斥邏輯
#### 🔧 優化改進
- 無視標簽模式下,自動過濾輸入框中的 HTML 標簽、標點符號及 MD 語法符號,消除格式干擾
- 將正則生成邏輯從 searchInFiles 移至 searchAndShowInSidebar 統一處理,簡化參數傳遞鏈路,解決默認值傳遞問題
### [2.3.3] - 2026-05-13
#### ✨ 新增功能
- 文本內容的`html標簽`、`MD語法`及`標點符號`忽略功能
#### 🐛 修復問題
- 將依賴閉包變量 isExpanded 的地方改為從 DOM 實時讀取展開狀態
#### 🔧 優化改進
- 超過2秒,隨時可以停止,返回已搜得結果
---
### [2.2.0] - 2026-05-12
#### ✨ 新增功能
- 單行模式字符寬度自定義設置(可以添加零寬字符、窄字符)
- 在主面板文件名匹配中直接選擇需要的文件組/組合
#### 🔧 優化改進
- 增強自定義文件組面板的編輯功能
- 優化主面板的調用、輸入框歷史條目的載入
### [2.1.1] - 2026-05-10
#### 🐛 修復問題
- 修復搜索歷史文件組及組合加載數據傳輸問題
#### 🔧 優化改進
- 優化單行模式文本顯示(對零寬字符、疊加字符、分詞符,優化計算)
### [2.1.0] - 2026-05-09
#### ✨ 新增功能
- 新增文本內容布爾查詢語法(支持 `&`、`|`、`!`、括號,可選開關)
- 新增文本內容變音符號忽略功能(支持九組字符的雙向匹配)
- 新增文件名匹配排除規則(支持 `!` 開頭的排除行)
#### 🐛 修復問題
- 修復搜索結果中多個關鍵字的高亮及定位
- 修復排除規則解析錯誤(為排除模式添加括號)
- 修復原生搜索 Enter 事件模擬問題(改用 `executeCommandById("search:search")`)
#### 🔧 優化改進
- 歷史數據自動修復(加載時補充缺失字段、修正布爾/正則標誌位衝突)
---
### [2.0.0] - 2026-05-06
#### ✨ 新增功能
- 新增長按顯示歷史菜單(300ms 長按 `❮`/`❯` 顯示歷史面板)
- 新增「重新搜索」按鈕,保留當前範圍設置(預定範圍/自定義範圍/組/組合等)
- 新增修改版標記(組/組合應用後編輯會顯示「已修改」,提交時保存快照)
- 新增顏色自定義(序號文字顏色、模式按鈕顏色、激活外框顏色等)
- 新增文件批量模式切換(文件頭懸浮按鈕「«」)
- 新增歷史面板寬度可調(設置中 200-600px)
- 新增搜索歷史快捷鍵(`Ctrl+←/→` 切換,`Ctrl+\` 顯示面板)
- 修補輔助編輯器快捷填充(點擊圖標選擇文件/標籤/路徑)
#### 🐛 修復問題
- 修復多行文本輸入框自動調整高度
#### 🔧 優化改進
- 優化單行模式文本顯示(基於全/半角字符測量截取,優化腳注及代碼顯示)
- 優化鍵盤導航(支持循環導航,Escape 清除焦點)
---
### [1.0.0] - 2026-04-29
#### ✨ 新增功能
- 基礎搜索功能(預定範圍、自定義範圍)
- 三種結果顯示模式(A/B/C)
- 條目獨立顯示模式切換
- 文件組與組合管理
- 默認預定範圍設置
- 結果排序(三層優先級:文件優先級 → 組間優先級 → 組內模式優先級)
- 原生搜索查詢支持
- 輔助編輯器(可視化構建查詢,支持 AND/OR/NOT、修飾符)
- 顏色自定義(基礎顏色、模式按鈕顏色)
- 鍵盤導航(↑/↓/Enter/Home/End/Escape)
- 右鍵菜單集成(預設範圍快搜、搜索面板)
- 搜索歷史管理(自動保存、去重、快捷鍵導航)
---
## 📊 Custom-Search vs Obsidian原生搜索 對比
### 一、特色功能對比
| 功能 | Custom-Search | 原生搜索 |
| --------------------- | :----------------------------: | :-------------------: |
| **文件組預設** | ✅ 自定義文件組,可保存重用 | ❌ 無 |
| **文件組組合** | ✅ 多個文件組可組合成更大範圍 | ❌ 無 |
| **預定範圍(默認範圍)** | ✅ 可設為默認,快速搜索 | ❌ 無 |
| **排除語法(NOT)** | ✅ `!A` | ✅ `-file:A` |
| **執行順序控制** | ✅ exclude-first / exclude-last | ❌ 固定 |
| **無索引延遲** | ✅ 每次搜索都快 | ❌ 每次掃描索引 |
| **搜索歷史** | ✅ 完整歷史面板 + 快捷鍵 | ❌ 無 |
| **結果排序**(文件/組/模式三級) | ✅ 自定義 | ❌ 僅文件名/時間 |
| **三種顯示模式**(A/B/C) | ✅ 全局 + 單條切換 | ⚠️ 僅展開/摺疊 |
| **可視化語法編輯** | ✅ 輔助編輯器 | ❌ 無 |
| **右鍵菜單快速預定搜索** | ✅ | ❌ |
| **結果渲染**(Markdown 格式) | ✅ 完整渲染 | ❌ 純文本 |
| **布爾查詢語法**(`& \| !`) | ✅ 可選開關 | ❌ 無 |
| **變音符號忽略** | ✅ 支持內容 /可手動`s[uū]tr[āa]` | ❌ 無(需手動) |
| **忽略標籤語法及標點** | ✅ | ❌ 無 |
---
### 二、搜索語法對比
| 運算符 | Custom-Search(本插件) | Obsidian 原生搜索 |
| ------------------------------- | :--------------------------------: | :---------------------: |
| **文件名/路徑 OR**(多選一) | ✅ 多行自動 OR | ✅ `file:A OR file:B` |
| **文件名/路徑 NOT**(排除) | ✅ `!A` 語法 | ✅ `-file:A` |
| **文件名 AND**(同時包含) | ⚠️ 需手寫正則 `^(?=.*A)(?=.*B)` | ✅ `file:A file:B` |
| **路徑 AND** | ⚠️ 需手寫正則 | ✅ `path:A path:B` |
| **執行順序控制**(先排除還是先包含) | ✅ `exclude-first` / `exclude-last` | ❌ 固定順序 |
| **內容 OR** | ✅ `A \| B` `(A\|B\|C)` | ✅ `A OR B OR C` |
| **內容 NOT** | ✅ `!A`(布爾模式) | ✅ `-A` |
| **內容 AND**(同一行) | ✅`A B` `A & B` `^(?=.*A)(?=.*B)` | ✅ `A AND B` |
| **內容 AND**(跨行) | ❌ 不支持 | ✅ `A B`(同一文件內) |
| | | |
| 範圍類型 | Custom-Search | Obsidian 原生搜索 |
| **文件名正則** | ✅ 完整支持 | ⚠️ 僅 `file:/正則/` |
| **路徑正則** | ✅ 完整支持 | ⚠️ 僅 `path:/正則/` |
| **文件夾路徑** | ✅ `^kosa/ju/` | ✅ `path:kosa/ju/` |
| **文件組預設** | ✅ 多組 OR 組合 | ❌ 無 |
| **文件組組合** | ✅ 組間可再組合 | ❌ 無 |
| **標籤**`#tag` | ✅ 可搜索(字符串匹配) | ✅ `tag:#佛學` |
| **Frontmatter 元數據**`key: value` | ✅ 可搜索(字符串匹配) | ✅ `frontmatter:` |
| **區塊ID** `^id` | ✅ 可搜索(字符串匹配) | ✅ `block:` |
| **任務搜索** `- [ ]` 和 `- [x]` | ✅ 可搜索(字符串匹配) | ✅ `task:`, `task-todo:` |
| **大小寫敏感** | ✅ 正則 `i` 標誌 | ✅ `match-case:`或 `(?i)` |
| **忽略標籤語法及標點** | ✅ | ❌ 無 |
| **變音符號忽略** | ✅ 支持 | ❌ 無 |
| **正則表達式** | ✅ 完整支持 | ✅ `/正則/` 或 `regex:/正則/` |
> **總結**:Custom-Search 專注於文件名/路徑範圍的精準控制和大庫性能,適合日常快速搜索;布爾模式提供簡潔的 `& | !` 語法;原生搜索在跨行 AND、元數據語義搜索方面更強大。二者互補,可通過「原生」按鈕一鍵切換。
---
### 三、性能對比(2-3萬文件實測)
| 場景 | Custom-Search | Obsidian 原生搜索 |
| ---------------------- | :-----------: | :--------------: |
| **首次搜索**(剛打開 Obsidian) | 0.3-0.8秒 | 2-4秒(載入索引)+ 1-3秒 |
| **後續搜索**(同一會話) | 0.2-0.5秒 | 1-3秒(每次掃描索引) |
| **搜索範圍很窄(<200文件)** | 0.1-0.3秒 | 1-3秒 |
| **搜索範圍很寬(>5000文件)** | 2-5秒 | 1-3秒 |
| **文件變更後搜索** | 0.2-0.5秒 | 1-4秒(需更新索引) |
| **記憶體佔用** | 💚 低(<20MB) | 💛 中(50-100MB) |
| **啟動 Obsidian 開銷** | 無影響 | 載入索引 2-4秒 |
小範圍(<500文件)是 Custom Search 的優勢區(文件名正則匹配後的範圍),快 5-10 倍。寬範圍(>5000文件)原生更快。
---
### 四、搜索類型與工具定位
#### 4.1 三種搜索類型的本質區別
| 類型 | 核心機制 | 示例 | 是否依賴索引 |
|:---|:---|:---|:---|
| **精確匹配** | 字符串完全相同(或正則匹配) | `search` → `search`、`Search`、`sūtra` → `sutra`* | ❌ 不需要 |
| **模糊匹配** | 字符串層面的近似(編輯距離、拼寫糾錯) | `recieve` → `receive` | ✅ 需要 |
| **語義匹配** | 含義層面的相似(向量、同義詞) | `汽車` → `轎車` | ✅ 需要 |
> \*註:大小寫不敏感、變音符號忽略是正則的擴展,本質仍是精確匹配——匹配「規範化後的相同字符串」。
#### 4.2 各搜索工具的定位
| 工具 | 精確匹配 | 忽略變音 | 無視標籤 | 模糊匹配 | 語義匹配 | 範圍控制 | 速度 |
| ----------------- | ---- | ---- | -------- | -------- | -------- | ---------------- | ----------- |
| **Obsidian 原生搜索** | ✅ | ❌ | ❌ | ❌ | ❌ | ⚠️ 手寫路徑 | 中等(依賴索引) |
| **Custom Search** | ✅ | ✅ | ✅ **獨有** | ❌ | ❌ | ✅ **核心(可保存/組合)** | **極快**(無索引) |
| **Omnisearch** | ✅ | ✅ | ❌ | ✅ **核心** | ❌ | ❌ | 中等(有索引) |
| **Note Gallery** | ✅ | ❌ | ❌ | ✅ | ❌ | ⚠️ 手寫路徑 | 中等 |
| **Dataview** | ✅ | ❌ | ❌ | ❌ | ❌ | ⚠️ `FROM` 語句 | 慢 |
| **QMD / Copilot** | ✅ | ❌ | ❌ | ⚠️ 有限 | ✅ **核心** | ❌ | 慢(向量計算) |
#### 4.3 性能與能力的權衡
| 類型 | 速度 | 資源佔用 | 適用場景 |
|:---|:---|:---|:---|
| **精確 + 範圍** | **極快(0.1-0.5秒)** | 極低(<20MB) | 知道要找什麼、知道大概在哪 |
| **模糊匹配** | 中等(1-2秒) | 中等(索引) | 不確定拼寫、想找近似 |
| **語義匹配** | 慢(2-5秒+) | 高(向量庫、模型) | 探索式搜索、找關聯概念 |
> **核心洞察:模糊和語義的「慢」不是實現問題,是數學問題。** 編輯距離和向量計算的本質決定了它們無法像字符串比較那樣快。
#### 4.4 Custom Search 的定位與設計理念
> **Custom Search = 對已知對象的精確快速定位**
| 維度 | 說明 |
|:---|:---|
| **做什麼** | 精確匹配 + 範圍控制 + 無視標籤 |
| **不做什麼** | 模糊匹配、語義匹配 |
| **為什麼不做** | 會犧牲速度,且與核心定位衝突 |
| **如何互補** | 可搭配 Omnisearch(模糊)或 QMD(語義)使用 |
**搜索類型對比:**
| 類型 | 機制 | Custom Search |
|:---|:---|:---|
| **精確匹配** | 字符串相同(含大小寫、變音符號) | ✅ 核心 |
| **無視標籤** | 跳過 HTML/標點,匹配渲染文本 | ✅ 特色 |
| **模糊匹配** | 編輯距離、拼寫糾錯 | ❌ 不做 |
| **語義匹配** | 向量相似度、AI | ❌ 不做 |
> 💡 **精確匹配求快,模糊匹配求全,語義匹配求懂。三者不可兼得,Custom Search 選擇了「快」。**
#### 4.5 使用建議
| 場景 | 推薦使用 |
| ----------------------- | :-----------: |
| **日常關鍵詞查找** | Custom-Search |
| **限定文件名/路徑、特定範圍** | Custom-Search |
| **排除特定文件(草稿、註解、備份)** | Custom-Search |
| **需要結果排序、渲染** | Custom-Search |
| **筆記庫很大(>5000文件)** | Custom-Search |
| **反覆搜索相關主題(善用歷史記錄)** | Custom-Search |
| **需要排除內容中的關鍵詞(內容 NOT)** | Custom-Search |
| **忽略標籤語法及標點** | Custom-Search |
| **變音符號忽略** | Custom-Search |
| **需要跨行 AND 邏輯** | 原生搜索 |
| **搜索範圍很寬(全庫)** | 原生搜索 |
| **需要多個搜索面板對比** | 原生搜索 |
---
### 五、一句話總結
| | 結論 |
| ----------------- | ------------------------------ |
| **Custom-Search** | 快、準、省記憶體,適合 80% 的日常文件名/路徑範圍搜索 |
| **原生搜索** | 功能全、語法豐富,適合 20% 的元數據/跨行布爾查詢 |
| **互補關係** | Custom-Search做主力,複雜需求轉原生(一鍵切換) |