TgWitness / Dokumentacja

Co zostało przetestowane →

Odniesienie / Archiwum i integracje

Telegram · Wyszukiwanie pełnotekstowe

Wyszukuj zapisane wiadomości według form słów, dokładnych fraz, domen i nazw użytkowników z symbolem @, z najlepszymi wynikami na początku, przy czym indeks jest powiązany z podpisanym dziennikiem.

TgWitness / Dokumentacja · Dochodzenie

Dochodzenie

Analiza archiwum · Lokalne rozpoznawanie tekstu (OCR) i transkrypcja · Wiki

Podgląd. W sekcji „Dziennik” wybierz opcję „Najlepsze dopasowanie · formy wyrazów” obok pola wyszukiwania. Wyniki są sortowane według algorytmu BM25 i obejmują inne formy tego samego słowa: wyszukiwanie „перевод” znajdzie „переводом” i „переводы”, a „transfer” znajdzie „transfers”; chińskie frazy są wyszukiwane bez spacji. Opcja „Najnowsze najpierw · dokładny tekst” zachowuje poprzednie wyszukiwanie podciągu w całym zapisie.

Indeks jest danymi pochodnymi. Jest on odtwarzany na podstawie podpisanego dziennika, sam nigdy nie jest podpisywany i nigdy nie jest eksportowany. Oryginalne zapisy pozostają niezmienione.

Na tej stronie

Składnia wyszukiwania#

Napisz Wyniki wyszukiwania
перевод карта Zapisy zawierające oba słowa, w dowolnej formie
"переводом на карту" Dokładna fraza, w tej kolejności
бонус OR подарок Którekolwiek z tych słów
перевод -казино Zapisy bez wykluczonego słowa
example.com Domena i jej subdomeny, również w ukrytych linkach i adresach URL przycisków
@username, t.me/username Wzmianki i linki dotyczące konta oraz wysłane przez nie wiadomości
#tag Hashtag
+79991234567, adres portfela, adres e-mail Ta sama wartość w postaci tekstu lub linków
from:@username, from:123456 Wiadomości od tego nadawcy
chat:-1001234567890 Jedna rozmowa; może ona ograniczyć wyłącznie Twój własny dostęp
id:42 Zapisane wersje wiadomości nr 42
since:2026-01-01 until:2026-01-31 Okres obserwacji; data bez godziny obejmuje cały dzień
kind:edited Tylko zmiany (new, snapshot, edited, recovered)
source:ocr, source:transcription, source:all Rozpoznany tekst zamiast wiadomości lub wraz z nimi

Przyimki i inne słowa funkcyjne są ignorowane, gdy występują inne słowa. Litery podobne występujące w słowie (np. łacińskie „a” w słowie cyrylickim), znaki o pełnej szerokości oraz ozdobne znaki Unicode i znaki niewidoczne są normalizowane.

Języki#

Język jest wykrywany dla każdego wpisu na podstawie skryptu i liter:

Skrypt Dopasowanie
cyrylica Lematy rosyjskie i ukraińskie z wykorzystaniem biblioteki pymorphy3. W przypadku braku opcjonalnego słownika ukraińskiego stosowany jest uproszczony moduł rozdzielania wyrazów dla języka ukraińskiego.
Łacina Angielski stemmer typu „Snowball”; znaki diakrytyczne są ignorowane
chiński, japoński, koreański, tajski, laotański, khmerski, birmański Nakładające się pary znaków: wyszukiwane są dowolne frazy bez spacji. Chińskie zapytania są dzielone na słowa za pomocą ieba
Inne skrypty Dokładne sformułowania

Słownik ukraiński (pymorphy3-dicts-uk) jest rozpowszechniany na licencji GPL-3.0, więc nie jest instalowany domyślnie. Zainstaluj go za pomocą pip install "tgwitness[uk-dictionary]"; indeks wykrywa nowy moduł analizujący i sam się odbudowuje.

Gdzie znajduje się indeks#

Tryb Przechowywanie danych Zastosowanie
Na dysku (domyślnie) search/fulltext.sqlite3 w katalogu obszaru roboczego Duże archiwa; zachowuje dane po ponownym uruchomieniu
Tylko w pamięci Brak danych na dysku; odbudowywane przy każdym uruchomieniu Na dysku nie ma żadnych kopii treści wiadomości
Wyłącz Brak indeksu; najnowsze na początku · zachowano dokładny tekst Minimalne wymagania instalacyjne

Główny administrator wybiera tryb w sekcji Dziennik → Filtry → Indeks wyszukiwania dla każdego obszaru roboczego. TGWITNESS_FULLTEXT=disk|memory|off Ustawia domyślną wartość dla obszarów roboczych, które nie mają własnego wyboru. Przełączenie na tryb pamięci lub wyłączenie powoduje usunięcie pliku. Plik indeksu ma takie samo zabezpieczenie jak dziennik: znajduje się w katalogu danych prywatnych . Nie jest szyfrowany i nie wchodzi w skład kopii zapasowych ani kopii poza siedzibą.

Nowe zapisy są indeksowane w tle w ciągu kilku sekund; wyszukiwanie indeksuje również najpierw krótki zaległy zestaw, dzięki czemu można znaleźć zapis zapisany przed chwilą. Istniejący dziennik jest indeksowany po aktualizacji bez blokowania panelu; do tego momentu wyniki obejmują zindeksowane zapisy, a dziennik pokazuje postęp. Odbudowa indeksu rozpoczyna się ponownie od pierwszego zapisu.

python -m tgwitness index status --data-dir data/live
python -m tgwitness index rebuild --data-dir data/live --json

rebuild wymaga zatrzymania panelu (w przeciwnym razie kod wyjścia wynosi 3). W przypadku --json, wyjście standardowe zawiera tylko wynik; informacje o postępie są kierowane do standardowego błędu.

Wyniki i podpisany dziennik#

Indeks przechowuje numer sekwencyjny i skrót ostatniego wpisu dziennika, który obejmuje, i porównuje je z dziennikiem podczas jego otwierania. Wymieniony, przywrócony lub edytowany dziennik powoduje przebudowę indeksu. Każda odpowiedź zgłasza tę pozycję, a każde trafienie jest odczytywane z podpisanego dziennika na podstawie jego numeru sekwencyjnego: indeks decyduje, które wpisy wyświetlić i w jakiej kolejności, ale nigdy nie decyduje o ich treści. Dostęp do czatu dotyczy własnego pola czatu dziennika, a nie treści indeksu.

Rozpoznany tekst#

Wyniki OCR i transkrypcje pozostają w swoich zaszyfrowanych plikach. Ich indeks istnieje wyłącznie w pamięci i jest odtwarzany po zakończeniu zadania rozpoznawania. Trafienie pojawia się w media.saved rekordzie, oznaczony jako rozpoznanie maszynowe wraz z silnikiem, modelem i fragmentem; nigdy nie jest prezentowany jako tekst wysłany w Telegramie. Ten sam indeks służy funkcji „Wyszukaj rozpoznany tekst”, która nadal dopasowuje również zwykłe podciągi.

Dostęp#

Dostęp ograniczony do czatu wyszukuje wyłącznie zapisy z tych czatów, w tym rozpoznany tekst załączników. chat: oraz inne filtry mogą jedynie zawęzić ten zbiór. Status indeksu wyświetlany w trybie dostępu ograniczonego do czatu pomija sumy dziennika. Tylko główny administrator może zmienić tryb lub odbudować indeks.

Zapytaj archiwum i MCP#

Po zakończeniu tworzenia indeksu archiwum pobiera z niego źródła: najlepsze dopasowania spośród wybranych czatów, przy czym zapisany tekst jest liczony tylko raz. Wysyłanych jest maksymalnie 24 źródeł; długie teksty są przycinane wokół dopasowania i oznaczane jako skrócone. Zapytania dotyczące ostatnich zmian, zapisanych wersji jednej wiadomości oraz wyszukiwania w czasie, gdy indeks jest nadal tworzony, wykorzystują poprzedni sposób pobierania danych w porządku chronologicznym. Podgląd pokazuje, która metoda została użyta.

Klienci MCP mogą wywołać search_messages z ranked=true oraz wyświetlać strony za pomocą next_offset. Połączenia z ograniczeniem zakresu odbierają wyłącznie swoje czaty.

Paginacja według rankingu obejmuje co najwyżej pierwsze wyniki 1,000, niezależnie od rozmiaru strony. Aby sprawdzić kolejne dopasowania, należy zawęzić zapytanie, czat lub okres. Wyszukiwanie według najnowszych wyników sortuje wiadomości, wyniki OCR i transkrypcji przed wybraniem każdej strony.

Zależności#

Pakiet Licencja Dlaczego
pymorphy3, pymorphy3-dicts-ru, DAWG2-Python MIT Lematy rosyjskie i ukraińskie; słowniki są ładowane lokalnie
snowballstemmer Klauzula BSD-3 Rdzenie angielskie, czysty Python
jieba MIT Segmentacja zapytań w języku chińskim, napisane wyłącznie w języku Python (tylko dystrybucja kodu źródłowego)
pymorphy3-dicts-uk (opcjonalnie) GPL-3.0 Pełny słownik języka ukraińskiego

Wymagany jest moduł SQLite FTS5 z unicode61 tokenizerem; jest on częścią biblioteki SQLite w aktualnych kompilacjach Pythona. Bez niego wyszukiwanie najlepszego dopasowania zgłasza, że funkcja jest niedostępna.

Test porównawczy#

python tools/bench_fulltext.py --messages 1000000 --work <empty directory>tworzy deterministyczny, podpisany dziennik zawierający mieszankę wiadomości w językach rosyjskim, ukraińskim, angielskim, chińskim i japońskim wraz z linkami i identyfikatorami w 200 czatach, buduje indeks oraz mierzy czas typowych wyszukiwań (50 wyników, mediana z 7 przebiegów).

Testowano na systemie Windows 11, procesorze Intel Core i9-13900K, 128 GB pamięci RAM, w środowisku Python 3.12.10, SQLite 3.49.1, z danymi na dysku exFAT, analizator fulltext-v1+pymorphy3-ru+light-uk+snowball-en:

Miara Wynik
Podpisany dziennik 1 000 000 wiadomości, 1,50 GiB, zapisanych w ciągu 19 minut
Tworzenie indeksu na podstawie dziennika 71 s, około 14 141 wiadomości na sekundę
Plik indeksowy 58 MiB, 3,8% dziennika
Wyszukiwanie bezpośrednio po utworzeniu nowego wpisu Mediana 8 ms, p95 9 ms
Poprzednie wyszukiwanie podciągu, ten sam dziennik перевод 3,2 s, 银行转账 2,6 s, verify-account.example 2,6 s
Wyszukiwanie Dopasowywanie rekordów Najlepsze dopasowanie, mediana str. 95 Najnowsze najpierw, mediana
Powszechnie używane słowa i ich formy: перевод 134,403 82 ms 85 ms 7 ms
Dwa słowa: оплата карта 28,996 43 ms 43 ms 14 ms
Rzadko spotykane słowo: розыгрыш подарок 28,881 42 ms 47 ms 13 ms
Dokładne sformułowanie: "переказ коштів на картку" nie wliczono 35 ms 36 ms 6 ms
Domena wraz z subdomenami: verify-account.example 12,435 17 ms 17 ms 3 ms
@nazwa_użytkownika: @support_desk_bot 10,331 15 ms 16 ms 3 ms
Chiński bez spacji: 银行转账 17,691 23 ms 24 ms 3 ms
Japoński: リンク 16,603 23 ms 25 ms 3 ms
Rdzeń angielski: withdrawal 27,775 26 ms 26 ms 2 ms
LUB i wykluczenia: бонус OR подарок -казино 268,034 190 ms 193 ms 19 ms
Filtr czatu: chat:-1000000000007 перевод 652 9 ms 9 ms 6 ms
Filtr czasowy: since:2026-01-01 until:2026-01-31 выплата 115,732 155 ms 156 ms 81 ms

Dokładna fraza jest sprawdzana dosłownie w wynikach w kolejności według rankingu, aż strona zostanie wypełniona, więc jej suma nie jest wliczana. Czas wyszukiwania rośnie wraz z liczbą pasujących rekordów; zawężenie czatu lub okresu przyspiesza szerokie wyszukiwania. Syntetyczny korpus powtarza niewielkie słownictwo, więc popularne słowa pasują do znacznie większej liczby rekordów niż w prawdziwych czatach.