TgWitness / תיעוד

מה נבדק ←

הפניה / ארכיון ושילובים

Telegram · חיפוש בטקסט מלא

חפש הודעות שנשמרו לפי צורות מילים, ביטויים מדויקים, דומיינים ושמות משתמש @, כשהתוצאות המתאימות ביותר מוצגות ראשונות, והאינדקס מקושר ליומן החתום.

TgWitness / תיעוד · חקירה

חקירה

ניתוח ארכיונים · OCR מקומי ותמלול · ויקי

תצוגה מקדימה. ב-Journal, בחרו באפשרות "התאמה מיטבית · צורות מילה" לצד שדה החיפוש. התוצאות מדורגות לפי 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 טקסט מזוהה במקום הודעות, או יחד איתן

מילות יחס ומילות פונקציה אחרות מתעלמות כאשר מילים אחרות מופיעות. אותיות דומות המופיעות בתוך מילה (כגון האות הלטינית 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, הפלט הסטנדרטי מכיל רק את התוצאה; התקדמות התהליך נשלחת לפלט השגיאה הסטנדרטי.

תוצאות והיומן החתום#

האינדקס מאחסן את מספר הרצף ואת ה-hash של הרשומה האחרונה ביומן שהוא מכסה, ובודק אותם מול היומן כאשר הוא נפתח. יומן שהוחלף, שוחזר או נערך גורם לבנייה מחדש. כל תגובה מדווחת על מיקום זה, וכל תוצאה נקראת חזרה מהיומן החתום לפי מספר הרצף שלה: האינדקס מחליט אילו רשומות להציג ובאיזה סדר, אך לעולם לא את תוכנן. הגישה לצ'אט מוחלת על שדה הצ'אט של היומן עצמו, ולא על תוכן האינדקס.

טקסט מזוהה#

OCR ותמלולים נשארים בארכיונים המוצפנים שלהם. האינדקס שלהם קיים רק בזיכרון ונבנה מחדש עם השלמת משימת הזיהוי. תוצאה מוצלחת מופיעה ברשומה media.saved הרשומה, מתויגת כ"זיהוי ממוחשב" עם ציון המנוע, המודל ו קטע מהטקסט; היא לעולם לא מוצגת כטקסט שנשלח ב-Telegram. אותו אינדקס משמש לחיפוש בטקסט שזוהה, אשר עדיין מתאים גם לתתי-מחרוזות רגילות.

גישה#

גישה בהיקף צ'אט מוצאת רק רשומות מהצ'אטים שלה, כולל טקסט מזוהה מהקובצים המצורפים שלהן. chat: ומסננים אחרים יכולים רק לצמצם את הקבוצה הזו. מצב האינדקס המוצג לגישה מוגבלת אינו כולל את הסכומים הכוללים של היומן. רק המנהל הראשי יכול לשנות את המצב או לבנות מחדש את האינדקס.

פנו לארכיון ול-MCP#

בקשה לארכיון תשאב את המקורות מהאינדקס הזה לאחר השלמתו: התוצאות המתאימות ביותר מתוך הצ'אטים הנבחרים, כאשר טקסט שנשמר נספר פעם אחת. נשלחים עד 24 מקורות; טקסטים ארוכים נחתכים סביב ההתאמה שלהם ומסומנים כקצוצים. שאלות לגבי שינויים אחרונים, גרסאות שמורות של הודעה אחת, וחיפושים בזמן שהאינדקס עדיין נבנה, משתמשות באחזור הכרונולוגי הקודם. התצוגה המקדימה מציגה איזו שיטה שימשה.

לקוחות MCP יכולים לקרוא search_messages עם ranked=true ו-page באמצעות 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 tokenizer; הוא חלק מ-SQLite ב גרסאות Python הנוכחיות. בלעדיו, חיפוש ההתאמה הטובה ביותר מדווח כי הוא אינו זמין.

בדיקת ביצועים#

python tools/bench_fulltext.py --messages 1000000 --work <empty directory>יוצר יומן חתום ודטרמיניסטי של הודעות מעורבות ברוסית, אוקראינית, אנגלית, סינית ויפנית, הכוללות קישורים ומזהים ב-200 צ'אטים, בונה את האינדקס ומודד את משך הזמן של חיפושים טיפוסיים (50 תוצאות, חציון של 7 ריצות).

נמדד ב-Windows 11, Intel Core i9-13900K, 128 GB RAM, 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 מילי-שניות, p95 של 9 מילי-שניות
חיפוש תת-מחרוזת קודם, אותו יומן перевод 3.2 שניות, 银行转账 2.6 שניות, verify-account.example 2.6 שניות
חיפוש התאמת רשומות התאמה מיטבית, חציון עמ' 95 החדשים ביותר תחילה, חציון
מילים נפוצות, צורות מילים: перевод 134,403 82 ms 85 ms 7 ms
שתי מילים: оплата карта 28,996 43 ms 43 ms 14 ms
מילה נדירה: розыгрыш подарок 28,881 42 ms 47 ms 13 ms
הביטוי המדויק: "переказ коштів на картку" לא נספר 35 ms 36 ms 6 ms
דומיין עם תת-דומיינים: verify-account.example 12,435 17 ms 17 ms 3 ms
@username: @support_desk_bot 10,331 15 ms 16 ms 3 ms
סינית ללא רווחים: 银行转账 17,691 23 ms 24 ms 3 ms
יפנית: リンク 16,603 23 ms 25 ms 3 ms
שורש באנגלית: withdrawal 27,775 26 ms 26 ms 2 ms
או והכללה: бонус OR подарок -казино 268,034 190 ms 193 ms 19 ms
מסנן צ'אט: chat:-1000000000007 перевод 652 9 ms 9 ms 6 ms
מסנן תקופות: since:2026-01-01 until:2026-01-31 выплата 115,732 155 ms 156 ms 81 ms

ביטוי מדויק נבדק באופן מילולי על המועמדים לפי סדר דירוג עד שהדף מתמלא, ולכן סך הכל שלו אינו נספר. הזמנים מתארכים עם מספר הרשומות התואמות; צמצום הצ'אט או התקופה מאיץ חיפושים רחבים. הקורפוס הסינתטי חוזר על אוצר מילים מצומצם, ולכן מילים נפוצות תואמות הרבה יותר רשומות מאשר בצ'אטים אמיתיים.