הפניה / ארכיון ושילובים
Telegram · חיפוש בטקסט מלא
חפש הודעות שנשמרו לפי צורות מילים, ביטויים מדויקים, דומיינים ושמות משתמש @, כשהתוצאות המתאימות ביותר מוצגות ראשונות, והאינדקס מקושר ליומן החתום.
ניתוח ארכיונים · 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 |
ביטוי מדויק נבדק באופן מילולי על המועמדים לפי סדר דירוג עד שהדף מתמלא, ולכן סך הכל שלו אינו נספר. הזמנים מתארכים עם מספר הרשומות התואמות; צמצום הצ'אט או התקופה מאיץ חיפושים רחבים. הקורפוס הסינתטי חוזר על אוצר מילים מצומצם, ולכן מילים נפוצות תואמות הרבה יותר רשומות מאשר בצ'אטים אמיתיים.