TgWitness / Документація

Що було протестовано →

Довідка / Архів та інтеграції

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 мс

Точна фраза перевіряється буквально серед варіантів у порядку рейтингу, доки сторінка не заповниться, тому її загальна кількість не враховується. Час виконання зростає із кількістю записів, що відповідають запиту; звуження чату або періоду прискорює широкий пошук. У синтетичному корпусі повторюється невеликий словниковий запас, тому загальні слова відповідають набагато більшій кількості записів, ніж у реальних чатах.