參考資料 / 存檔與整合功能
Telegram · 全文搜尋
可透過詞形、精確短語、網域及 @用戶名 搜尋已儲存的訊息,結果依最符合的順序排列,且索引與簽名日誌綁定。
檔案分析 · 本地 OCR 與文字轉錄 · 維基
預覽。在「日誌」中,於搜尋欄旁選擇「最佳匹配 · 詞形變體」。 搜尋結果依 BM25 演算法排序,並會匹配同一詞彙的其他詞形: 搜尋「перевод」會找到「переводом」和「переводы」,搜尋「transfer」會找到「transfers」,而中文 短語則會以不帶空格的形式被檢索。選擇「最新優先 · 精確文字」可維持先前 針對整個記錄進行的子字串搜尋。
索引屬衍生資料。它由簽名日誌重建而成,本身從未經過簽名, 也絕不會被導出。原始記錄不會被更改。
搜尋語法#
| 撰寫 | 搜尋結果 |
|---|---|
перевод карта |
同時包含這兩個詞彙的記錄,形式不限 |
"переводом на карту" |
請按此順序保留確切的詞句 |
бонус OR подарок |
任一詞彙 |
перевод -казино |
不含排除詞的記錄 |
example.com |
該網域及其子網域,包括隱藏連結和按鈕網址在內 |
@username, t.me/username |
該帳號的提及與連結,以及其發送的訊息 |
#tag |
主題標籤 |
+79991234567、一個錢包地址、一個電子郵件地址 |
以文字或連結形式呈現相同內容 |
from:@username, from:123456 |
來自該發送者的訊息 |
chat:-1001234567890 |
一個聊天室;它只能限制您自身的存取權限 |
id:42 |
訊息 42 的儲存版本 |
since:2026-01-01 until:2026-01-31 |
觀察期間;未標示時間的日期代表整日 |
kind:edited |
僅限編輯 (new, snapshot, edited, recovered) |
source:ocr, source:transcription, source:all |
以識別出的文字取代訊息,或與訊息並存 |
當存在其他單字時,介詞及其他功能詞將被忽略。 混入單字中的相似字母(例如西文字母「a」出現在西里爾字母單字中)、全寬 及裝飾性 Unicode 字母,以及不可見字元,均會被標準化。
語言#
系統會根據每筆記錄中的腳本和字母來偵測語言:
| 腳本 | 匹配 |
|---|---|
| 西里爾字母 | 使用 pymorphy3 處理俄語與烏克蘭語詞幹。若未啟用可選的烏克蘭語詞典,則會使用輕量級的烏克蘭語詞幹分析器 |
| 拉丁文 | 英文 Snowball 詞幹提取器;忽略音標符號 |
| 中文、日文、韓文、泰文、老撾文、高棉文、緬甸文 | 重疊字元對:搜尋時不包含空格。中文查詢會使用 jieba 進行分詞 |
| 其他腳本 | 精確詞句 |
烏克蘭語辭典 (pymorphy3-dicts-uk) 依據 GPL-3.0 授權發佈,因此
預設不會安裝。請使用 pip install "tgwitness[uk-dictionary]";
索引模組會偵測到新的分析器並自動重新建構。
索引的存放位置#
| 模式 | 儲存 | 使用說明 |
|---|---|---|
| 儲存於磁碟(預設) | search/fulltext.sqlite3 位於工作區目錄中 |
大型存檔;重啟後仍能保留資料 |
| 僅限記憶體中 | 磁碟上不留任何資料;每次啟動時皆重新建置 | 磁碟上不會存有訊息內容的任何衍生副本 |
| 關閉 | 無索引;最新內容優先 · 保留原始文字 | 最低安裝需求 |
主要管理員可於「日誌」→「篩選器」→「搜尋索引」中
為每個工作區選擇模式。 TGWITNESS_FULLTEXT=disk|memory|off 並為
未自行設定的空間設定預設值。切換至「記憶體」或「關閉」將刪除該檔案。
索引檔案與日誌享有相同的保護措施:它存放於私有資料
目錄中。該檔案未經加密,且不包含在備份或異地副本之中。
新記錄會在數秒內於後台完成索引;搜尋時也會優先索引 短暫的歷史記錄,因此剛儲存的記錄也能被找到。現有的日誌會在 更新後完成索引,且不會阻塞控制面板;在此之前,搜尋結果涵蓋 已索引的記錄,而日誌會顯示進度。重建索引時會從 第一筆記錄開始重新進行。
python -m tgwitness index status --data-dir data/live
python -m tgwitness index rebuild --data-dir data/live --json
rebuild 需停止該面板(否則退場代碼為 3)。若使用 --json,
標準輸出僅顯示結果;進度訊息則輸出至標準錯誤。
結果與簽名日誌#
索引會儲存其所涵蓋之最後一筆日誌記錄的序號與雜湊值, 並在開啟日誌時將其與日誌內容進行比對。若日誌遭替換、還原或編輯, 則會觸發索引重建。每次回應都會回報此位置,而每次查詢結果皆 透過其序號從簽名日誌中讀取:索引僅決定 應顯示哪些記錄及顯示順序,絕不涉及記錄內容。聊天室存取權限僅適用於 日誌本身的聊天室欄位,不適用於索引內容。
已識別的文字#
OCR 結果與轉錄內容仍保留於其加密的原始檔中。其索引僅存在於
記憶體中,並會在辨識任務完成時重新建置。當出現匹配結果時,該結果會顯示於其
media.saved 記錄上會顯示一個匹配結果,標記為「機器識別」,並附有引擎、模型及
摘錄內容;該內容絕不會以 Telegram 傳送的文字形式呈現。同一索引亦供
「搜尋已識別文字」功能使用,該功能同時仍可匹配純文字子字串。
存取#
「聊天室範圍」存取僅會搜尋來自該聊天室的記錄,包括其附件中
被識別的文字。 chat: 以及其他篩選條件僅能進一步縮小該資料集範圍。顯示給範圍內存取的索引狀態
會省略日誌總數。僅有主要管理員才能變更
模式或重建索引。
請諮詢檔案庫與 MCP#
當索引建立完成後,查詢功能將從此索引擷取來源: 選定聊天室中的最佳匹配結果,且每則已儲存的文字僅計入一次。最多會傳送 24 個來源;長篇文字會以匹配內容為界截斷,並標記為「截斷」。 關於近期變更、單則訊息的儲存版本,以及在 索引仍在建立期間的搜尋,均使用先前的按時間順序檢索方式。預覽 畫面會顯示所使用的檢索方法。
MCP 客戶端可呼叫 search_messages 透過 ranked=true ,並透過
next_offset。範圍限定連線僅會接收其對應的聊天內容。
排序分頁最多涵蓋前 1,000 筆結果,無論頁面大小為何。請縮小查詢範圍、聊天室或時間範圍,以檢視更多匹配結果。按「最新優先」搜尋時,系統會在選取各頁面之前,先將訊息、OCR 及轉錄結果依此順序排列。
依賴項#
| 套件 | 授權條款 | 原因 |
|---|---|---|
| pymorphy3、pymorphy3-dicts-ru、DAWG2-Python | MIT | 俄語與烏克蘭語詞幹;詞典於本地載入 |
| snowballstemmer | BSD-3 條款 | 英文詞幹,純 Python |
| jieba | MIT | 中文查詢分詞,純 Python 實作(僅提供原始碼發行版) |
| pymorphy3-dicts-uk(可選) | GPL-3.0 | 完整的烏克蘭語詞典 |
SQLite FTS5 需搭配 unicode61 分詞器;此功能已包含於
當前 Python 建置版本的 SQLite 中。若未啟用,最佳匹配搜尋將回報該功能不可用。
基準測試#
python tools/bench_fulltext.py --messages 1000000 --work <empty directory>建立一個包含俄語、烏克蘭語、英語、
中文及日語訊息的確定性簽名日誌,內容涵蓋 200 個聊天室中的連結與識別碼,並建立索引
以及測量典型搜尋所需時間(50 筆結果,7 次執行中的中位數)。
測試環境:Windows 11、Intel Core i9-13900K、128 GB 記憶體、Python 3.12.10、SQLite
3.49.1,資料儲存於 exFAT 磁碟機,分析器 fulltext-v1+pymorphy3-ru+light-uk+snowball-en:
| 度量 | 結果 |
|---|---|
| 簽名日誌 | 1,000,000 則訊息,1.50 GiB,於 19 分鐘內寫入 |
| 從日誌建立索引 | 71 秒,約每秒 14,141 則訊息 |
| 索引檔案 | 58 MiB,佔日誌的 3.8% |
| 在新記錄生成後立即進行搜尋 | 中位數 8 毫秒,第 95 百分位數 9 毫秒 |
| 先前子字串搜尋,同一日誌 | перевод 3.2 秒, 银行转账 2.6 秒, verify-account.example 2.6 秒 |
| 搜尋 | 匹配的記錄 | 最佳匹配、中位數 | p95 | 最新優先,中位數排序 |
|---|---|---|---|---|
常見詞彙及其詞形: перевод |
134,403 | 82 毫秒 | 85 毫秒 | 7 毫秒 |
兩個字: оплата карта |
28,996 | 43 毫秒 | 43 毫秒 | 14 毫秒 |
生僻詞: розыгрыш подарок |
28,881 | 42 毫秒 | 47 毫秒 | 13 毫秒 |
精確短語: "переказ коштів на картку" |
不計入 | 35 毫秒 | 36 毫秒 | 6 毫秒 |
網域及其子網域: verify-account.example |
12,435 | 17 毫秒 | 17 毫秒 | 3 毫秒 |
@使用者名稱: @support_desk_bot |
10,331 | 15 毫秒 | 16 毫秒 | 3 毫秒 |
中文(無空格): 银行转账 |
17,691 | 23 毫秒 | 24 毫秒 | 3 毫秒 |
日文: リンク |
16,603 | 23 毫秒 | 25 毫秒 | 3 毫秒 |
英文詞幹: withdrawal |
27,775 | 26 毫秒 | 26 毫秒 | 2 毫秒 |
或與排除: бонус OR подарок -казино |
268,034 | 190 毫秒 | 193 毫秒 | 19 毫秒 |
聊天過濾器: chat:-1000000000007 перевод |
652 | 9 毫秒 | 9 毫秒 | 6 毫秒 |
時間範圍篩選器: since:2026-01-01 until:2026-01-31 выплата |
115,732 | 155 毫秒 | 156 毫秒 | 81 毫秒 |
系統會依排名順序,逐一對候選結果進行字面比對,直到頁面 填滿為止,因此其總數不計入統計。搜尋時間會隨匹配記錄的數量增加而增長; 縮小聊天室範圍或時間區間,可加快廣泛搜尋的速度。合成語料庫重複 使用少量詞彙,因此常見詞彙所匹配的記錄數量遠多於真實聊天記錄。