Довідка / Архів та інтеграції
Telegram · Повнотекстовий пошук
Знайдіть збережені повідомлення за формами слів, точними фразами, доменами та @іменами користувачів, з найкращими збігами на початку, з індексом, прив’язаним до підписаного журналу.
TgWitness / Документація · Розслідування
Аналіз архіву · Локальне розпізнавання тексту та транскрипція · Вікі
Попередній перегляд. У розділі «Журнал» виберіть «Найкращий збіг · форми слів» поруч із полем пошуку. Результати ранжуються за алгоритмом BM25 і відповідають іншим формам того самого слова: «перевод» знаходить «переводом» і «переводи», «transfer» знаходить «transfers», китайська фраза знаходиться без пробілів. «Новіші спочатку · точний текст» зберігає попередній пошук підрядка в усьому записі.
Індекс є похідними даними. Він відтворюється на основі підписаного журналу, сам ніколи не підписується і ніколи не потрапляє до експорту. Оригінальні записи не змінюються.
На цій сторінці
Синтаксис пошуку#
| Написати | Знахідки |
|---|---|
перевод карта |
Записи, що містять обидва слова в будь-якій формі |
"переводом на карту" |
Точна фраза, саме в такому порядку |
бонус OR подарок |
Будь-яке слово |
перевод -казино |
Записи без виключеного слова |
example.com |
Домен та його піддомени, у тому числі в прихованих посиланнях та URL-адресах кнопок |
@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 |
Розпізнаний текст замість повідомлень або разом із ними |
Прийменники та інші службові слова ігноруються, якщо поруч є інші слова. Схожі літери, що потрапили в слово (наприклад, латинська «а» у слові кирилицею), літери 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 токенізатором; він входить до складу SQLite в
поточних збірках Python. Без нього пошук найкращого збігу повідомляє про його недоступність.
Тестування продуктивності#
python tools/bench_fulltext.py --messages 1000000 --work <empty directory>Створює детермінований підписаний журнал, що містить повідомлення російською, українською, англійською,
китайською та японською мовами з посиланнями та ідентифікаторами у 200 чатах, формує індекс
та вимірює час виконання типових пошукових запитів (50 результатів, медіана за 7 запусків).
Виміряно на Windows 11, Intel Core i9-13900K, 128 ГБ оперативної пам’яті, Python 3.12.10, SQLite
3.49.1, дані на диску з файловою системою exFAT, аналізатор fulltext-v1+pymorphy3-ru+light-uk+snowball-en:
| Вимірювання | Результат |
|---|---|
| Підписаний журнал | 1 000 000 повідомлень, 1,50 ГіБ, записано за 19 хвилин |
| Створення індексу на основі журналу | 71 с, приблизно 14 141 повідомлень на секунду |
| Індексний файл | 58 Мб, 3,8 % журналу |
| Пошук одразу після створення нового запису | Медіана — 8 мс, p95 — 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 мс |
@username: @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 мс |
Точна фраза перевіряється буквально серед варіантів у порядку рейтингу, доки сторінка не заповниться, тому її загальна кількість не враховується. Час виконання зростає із кількістю записів, що відповідають запиту; звуження чату або періоду прискорює широкий пошук. У синтетичному корпусі повторюється невеликий словниковий запас, тому загальні слова відповідають набагато більшій кількості записів, ніж у реальних чатах.