TgWitness / Documentação

O que foi testado →

Referência / Arquivo e integrações

Telegram · Pesquisa de texto completo

Encontre mensagens salvas por formas de palavras, frases exatas, domínios e @nomes de usuário, com as melhores correspondências exibidas primeiro, tendo o índice vinculado ao diário assinado.

TgWitness / Documentação · Investigação

Investigação

Análise de arquivos · OCR local e transcrição · Wiki

Pré-visualização. No “Diário”, selecione “Melhor correspondência · formas da palavra” ao lado do campo de pesquisa. Os resultados são classificados pelo BM25 e correspondem a outras formas da mesma palavra: “перевод” encontra “переводом” e “переводы”, “transfer” encontra “transfers”, uma frase em chinês é encontrada sem espaços. A opção “Mais recentes primeiro · texto exato” mantém a pesquisa anterior de subcadeias de caracteres em todo o registro.

O índice é um dado derivado. Ele é reconstruído a partir do diário assinado, nunca é assinado por si só e nunca é incluído em uma exportação. Os registros originais não sofrem alterações.

Nesta página

Sintaxe de pesquisa#

Escrever Resultados
перевод карта Registros que contenham ambas as palavras, em qualquer forma
"переводом на карту" A frase exata, nesta ordem
бонус OR подарок Qualquer uma das palavras
перевод -казино Registros sem a palavra excluída
example.com O domínio e seus subdomínios, inclusive em links ocultos e URLs de botões
@username, t.me/username Menções e links da conta, além das mensagens que ela enviou
#tag A hashtag
+79991234567, um endereço de carteira, um endereço de e-mail O mesmo valor em texto ou links
from:@username, from:123456 Mensagens desse remetente
chat:-1001234567890 Um chat; ele só pode restringir o seu próprio acesso
id:42 Versões salvas da mensagem 42
since:2026-01-01 until:2026-01-31 Período de observação; uma data sem horário abrange o dia inteiro
kind:edited Apenas edições (new, snapshot, edited, recovered)
source:ocr, source:transcription, source:all Texto reconhecido em vez de, ou junto com, mensagens

Preposições e outras palavras funcionais são ignoradas quando outras palavras estão presentes. Letras semelhantes misturadas em uma palavra (um “a” latino dentro de uma palavra cirílica), letras Unicode de largura total e decorativas, bem como caracteres invisíveis, são normalizadas.

Idiomas#

O idioma é detectado em cada registro a partir de seu script e das letras:

Script Correspondência
Cirílico Lemas em russo e ucraniano com o pymorphy3. Sem o dicionário opcional de ucraniano, é utilizado um stemmer ucraniano simplificado
Latim Stemmer “Snowball” em inglês; os diacríticos são ignorados
Chinês, japonês, coreano, tailandês, laosiano, khmer, birmanês Pares de caracteres sobrepostos: qualquer frase é encontrada sem espaços. As consultas em chinês são divididas em palavras com o jieba
Outros scripts Palavras exatas

O dicionário ucraniano (pymorphy3-dicts-uk) é distribuído sob a licença GPL-3.0, portanto, não vem instalado por padrão. Instale-o com pip install "tgwitness[uk-dictionary]"; o índice reconhece o novo analisador e se recompila automaticamente.

Onde fica o índice#

Modo Armazenamento Utilização
No disco (padrão) search/fulltext.sqlite3 no diretório do espaço de trabalho Arquivos grandes; resiste a reinicializações
Apenas na memória Nada fica armazenado no disco; é reconstruída a cada inicialização Nenhuma cópia derivada do texto da mensagem no disco
Desativado Sem índice; Mais recentes primeiro · o texto exato permanece Instalações mínimas

O administrador principal escolhe o modo em Diário → Filtros → Índice de pesquisa para cada espaço de trabalho. TGWITNESS_FULLTEXT=disk|memory|off Define o padrão para espaços de trabalho que não tenham sua própria escolha. Mudar para “memória” ou desativar exclui o arquivo. O arquivo de índice tem a mesma proteção que o diário: ele fica no diretório de dados privados . Não é criptografado e não faz parte de backups nem de cópias externas.

Novos registros são indexados em segundo plano em questão de segundos; uma pesquisa também indexa primeiro um pequeno acúmulo de registros, de modo que um registro salvo há pouco tempo seja encontrado. Um diário existente é indexado após a atualização sem bloquear o painel; até então, os resultados abrangem os registros indexados e o diário mostra o andamento. A reconstrução do índice recomeça a partir do primeiro registro.

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

rebuild é necessário que o painel seja encerrado (caso contrário, código de saída 3). Com --json, a saída padrão contém apenas o resultado; o progresso é direcionado para a saída de erro padrão.

Resultados e o diário assinado#

O índice armazena o número de sequência e o hash do último registro do diário que ele abrange e os verifica em relação ao diário quando este é aberto. Um diário substituído, restaurado ou editado provoca uma reconstrução. Cada resposta relata essa posição, e cada ocorrência é recuperada do diário assinado por meio de seu número de sequência: o índice decide quais registros exibir e em que ordem, mas nunca seu conteúdo. O acesso ao chat é aplicado ao próprio campo de chat do diário, não ao conteúdo do índice.

Texto reconhecido#

O OCR e as transcrições permanecem em seus artefatos criptografados. Seu índice existe apenas na memória e é reconstruído quando uma tarefa de reconhecimento é concluída. Uma correspondência aparece em seu media.saved registro, rotulado como “reconhecimento automático”, com o mecanismo, o modelo e um trecho; nunca é apresentado como texto enviado no Telegram. O mesmo índice serve para a função “Pesquisar texto reconhecido”, que também continua a encontrar subcadeias de caracteres simples.

Acesso#

O acesso restrito ao chat localiza apenas registros de seus chats, incluindo o texto reconhecido de seus anexos. chat: e outros filtros podem apenas restringir esse conjunto. O status do índice exibido para o acesso restrito omite os totais do diário. Somente o administrador principal pode alterar o modo ou reconstruir o índice.

Consulte o arquivo e o MCP#

A consulta ao arquivo recupera suas fontes a partir desse índice quando ele estiver completo: as melhores correspondências entre os chats selecionados, com cada texto salvo contado uma única vez. São enviadas até 24 fontes; textos longos são cortados em torno de sua correspondência e marcados como truncados. Consultas sobre alterações recentes, versões salvas de uma mensagem e pesquisas enquanto o índice ainda está sendo construído utilizam a recuperação cronológica anterior. A visualização prévia mostra qual método foi utilizado.

Os clientes MCP podem chamar search_messages com ranked=true e acessar com next_offset. Conexões com escopo restrito recebem apenas seus chats.

A paginação ordenada abrange, no máximo, os primeiros resultados 1,000, independentemente do tamanho da página. Restrinja a consulta, o chat ou o período para examinar mais correspondências. As buscas que priorizam as mensagens mais recentes ordenam as mensagens, os resultados de OCR e de transcrição antes de selecionar cada página.

Dependências#

Pacote Licença Por que
pymorphy3, pymorphy3-dicts-ru, DAWG2-Python MIT Lemas em russo e ucraniano; os dicionários são carregados localmente
snowballstemmer BSD-3-Cláusula Radicais em inglês, Python puro
jieba MIT Segmentação de consultas em chinês, Python puro (apenas distribuição do código-fonte)
pymorphy3-dicts-uk (opcional) GPL-3.0 Dicionário completo de ucraniano

É necessário o SQLite FTS5 com o unicode61 tokenizador; ele faz parte do SQLite nas versões atuais do Python. Sem ele, a pesquisa de melhor correspondência informa que não está disponível.

Avaliação comparativa#

python tools/bench_fulltext.py --messages 1000000 --work <empty directory>Cria um diário assinado determinístico com mensagens mistas em russo, ucraniano, inglês, chinês e japonês, com links e identificadores em 200 chats, constrói o índice e mede o tempo de pesquisas típicas (50 resultados, mediana de 7 execuções).

Testado no Windows 11, Intel Core i9-13900K, 128 GB de RAM, Python 3.12.10, SQLite 3.49.1, dados em uma unidade exFAT, analisador fulltext-v1+pymorphy3-ru+light-uk+snowball-en:

Medida Resultado
Diário assinado 1.000.000 de mensagens, 1,50 GiB, gravadas em 19 minutos
Criação de índice a partir do diário 71 s, cerca de 14.141 mensagens por segundo
Arquivo de índice 58 MiB, 3,8% do diário
Pesquisar logo após um novo registro Mediana de 8 ms, p95 de 9 ms
Pesquisa de subcadeia anterior, mesmo diário перевод 3,2 s, 银行转账 2,6 s, verify-account.example 2,6 s
Pesquisar Registros correspondentes Melhor correspondência, mediana p95 Mais recentes primeiro, mediana
Palavras comuns e suas formas: перевод 134,403 82 ms 85 ms 7 ms
Duas palavras: оплата карта 28,996 43 ms 43 ms 14 ms
Palavra rara: розыгрыш подарок 28,881 42 ms 47 ms 13 ms
Frase exata: "переказ коштів на картку" não contabilizado 35 ms 36 ms 6 ms
Domínio com subdomínios: verify-account.example 12,435 17 ms 17 ms 3 ms
@username: @support_desk_bot 10,331 15 ms 16 ms 3 ms
Chinês sem espaços: 银行转账 17,691 23 ms 24 ms 3 ms
Japonês: リンク 16,603 23 ms 25 ms 3 ms
Raiz em inglês: withdrawal 27,775 26 ms 26 ms 2 ms
OU e exclusão: бонус OR подарок -казино 268,034 190 ms 193 ms 19 ms
Filtro de bate-papo: chat:-1000000000007 перевод 652 9 ms 9 ms 6 ms
Filtro de período: since:2026-01-01 until:2026-01-31 выплата 115,732 155 ms 156 ms 81 ms

Uma frase exata é verificada literalmente nos candidatos em ordem de classificação até que a página esteja cheia; portanto, seu total não é contabilizado. O tempo de resposta aumenta com o número de registros correspondentes; restringir o chat ou o período torna as buscas amplas mais rápidas. O corpus sintético repete um vocabulário reduzido, de modo que palavras comuns correspondem a muito mais registros do que em chats reais.