Skip to content

חיפוש#543

Open
palmoni5 wants to merge 30 commits into
Otzaria:devfrom
palmoni5:cherry-pick-commits
Open

חיפוש#543
palmoni5 wants to merge 30 commits into
Otzaria:devfrom
palmoni5:cherry-pick-commits

Conversation

@palmoni5

@palmoni5 palmoni5 commented Jul 5, 2026

Copy link
Copy Markdown
Collaborator
  • העברת רג'קס הדגשת התוצאות למנוע
  • האצלת עיבוד הטקסט של החיפוש למנוע: נרמול, טוקניזציה והדגשה ליטרלית

gemini-code-assist[bot]

This comment was marked as resolved.

@palmoni5 palmoni5 force-pushed the cherry-pick-commits branch from 2a9b682 to 17bb4b4 Compare July 5, 2026 12:23
@palmoni5 palmoni5 linked an issue Jul 5, 2026 that may be closed by this pull request
@palmoni5 palmoni5 force-pushed the cherry-pick-commits branch 2 times, most recently from b2a556d to 15a3403 Compare July 6, 2026 06:53
@palmoni5 palmoni5 force-pushed the cherry-pick-commits branch 3 times, most recently from 29331d6 to ca4ae77 Compare July 8, 2026 20:52
palmoni5 and others added 20 commits July 10, 2026 15:42
הרג'קסים האחרונים שנגזרים משאילתת חיפוש עוברים לצריכה מהמנוע (מקור אמת
יחיד), כך שנרמול האינדוקס, פירוק השאילתה וההדגשות לא יכולים לסטות זה מזה:

- sanitizeQuery ו-splitQueryWords מאצילים למנוע במקום רג'קסים מקומיים
- נרמול טקסט/PDF לאינדוקס וזיהוי עמודי זבל מאצילים למנוע; ה-worker isolate
  של האינדוקס מאתחל את RustLib בעצמו (עצל, חד-פעמי)
- ההדגשה הליטרלית בחיפוש בתוך ספר (טקסט, PDF ומפרשים) מקמפלת תבנית
  שמגיעה מהמנוע במקום לבנות אותה ב-Dart
- countMatches סופר באותה התאמה בדיוק כמו highLight (תבנית מהמנוע ובדיקת
  גבולות מילה) — המונה תואם את מה שמודגש בפועל
- הוסרה בדיקת "נראה כמו רגקס" בפתיחת ספר מתוצאה: המנוע מנקה מטא-תווים
  לפני בניית השאילתה, כך שקלט המשתמש לעולם אינו מפורש כתבנית
- תשתית טסטים: אתחול גלובלי של ספריית המנוע הנייטיבית דרך
  flutter_test_config, עם דילוג מסודר כשאין build מקומי
- הרחבת parseCategoryQuery להתאמת ספרים (לא רק קטגוריות) לפי שם, בבניית book-facet.

- העברת scope החיפוש במפורש ל-AddHistory במקום הסתמכות על state של SearchBloc, שמתעדכן אסינכרונית ולכן ה-scope נאבד מההיסטוריה.

- ניקוי תחביר @ משדה החיפוש לאחר פענוח, כך שההיסטוריה שומרת query נקי והשחזור ממנה עובד (במקום לחפש מילולית 'שלום@תורה').
עד כה תבנית ההדגשה בספר פתוח נבנתה מצורת השאילתה בלבד, כך שמסמך שנמצא
דרך וריאנט — שגיאת כתיב, קידומת, חלק ממילה או מרחק-עריכה — הוצג בלי
הדגשה. עכשיו ה-gateway מזין ברקע, בזמן ריצת החיפוש, תבנית מבוססת-אינדקס
מהמנוע (אותם אוטומטים של החיפוש עצמו), ו-highLight מוצא אותה במטמון לפי
מפתח הפרמטרים; באין רשומה נשאר ה-fallback הסינכרוני הקודם. פתיחת ספר עם
חיפוש פעיל מזינה גם היא, כך שגם טאבים משוחזרים מכוסים.

מצב החיפוש (advanced/fuzzy) הוא חלק ממפתח המטמון, כך ששני המצבים לא
חולקים תבנית בטעות; פרמטר isFuzzy של highLight, שהיה קיים ולא בשימוש,
נכנס לשרשרת. בדיקת גבולות המילה יושרה לסט is_attached_mark של המנוע —
סוף-פסוק ונו"ן הפוכה שוברים גבול ואינם נבלעים, כך ש"ברא" מודגש גם
ב"ברא׃והארץ".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… אחת

חיפוש:
- ה-bloc צורך את ה-stream המשולב של המנוע (searchStreamWithCounts):
  האירוע הראשון נושא ספירה כוללת + ספירה לפי ספר מאותו מעבר אינדקס —
  ריצה אחת של השאילתה במקום שלוש (stream + count + countByBook);
  countTexts הנפרד בוטל, וספירות ה"עץ החלקי" מה-chunk הראשון מיותרות
  כי הספירות האמיתיות מגיעות לפני התוצאות
- facet_helper ממפה תוצאות לספרים לפי filePath היציב במקום הסדר
  הקטלוגי המוטמע ב-id (שנשבר כשהספרייה משתנה אחרי האינדוקס)
- ספירות facets לקבוצות רצות במקביל (Future.wait), וספירות כפולות
  ממתינות על Future משותף במקום לולאת polling של 50ms

אינדוקס:
- ספר טקסט מאונדקס בקריאת FFI אחת (engine.addTextBook): פיצול שורות,
  reference trail, נרמול וטביעת אצבע רצים במנוע; ה-isolate נותר ל-PDF
- מסלולי ה-PDF וה-isolate עברו לנרמול באצווה (קריאת FFI אחת ל-200
  שורות במקום 1-2 קריאות לשורה)
- מחיקת רשומות ספר לפי filePath היציב במקום לפי כותרת

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
שלושת המקומות שפיצלו את השאילתה לפי רווחים (שורת האפשרויות למילה
הנוכחית, תצוגת השאילתה המפורמטת ותוויות ההיסטוריה — שם הפיצול היה
שבור ממילא בגלל \s מילולי) עוברים ל-splitQueryWords של המנוע, כך
שמפתחות "{מילה}_{אינדקס}" מתיישרים עם החוקים החדשים (רמב"ם מילה
אחת, ג'ורג' עם גרש פנימי).

state פר-מילה משוחזר (סשן/היסטוריה) שנבנה על חוקי-פיצול ישנים מזוהה
ע"י SearchQueryBuilder.restoredPerWordStateMatches ונמחק כמקשה אחת
במקום לזלוג למילה הלא-נכונה.

pubspec: המנוע נצרך זמנית מ-path מקומי עד פרסום 0.6.8.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
מילות splitQueryWords נושאות '/" ASCII בעוד שהשדה עשוי להכיל את
הצורות העבריות — עם גרשיים-בטוקנים ההחטאה הפכה שכיחה (כל רמב״ם
מהמקלדת). הקיפול שומר-אורך ולכן ה-offsets בטקסט הגולמי נכונים.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SearchQueryBuilder.queryWordSpans ממפה כל מילת splitQueryWords לטווח
שלה בטקסט הגולמי: מקטע שמתפצל לכמה מילים (בית-דין) מקבל טווח נפרד
לכל אחת — הסמן על דין בוחר את דין_1 ולא את בית_0; מילה שאינה ניתנת
לאיתור בתוך המקטע (נורמליזציה משנת-אורך: רמב''ם→רמב"ם, א.ב→אב)
מקבלת את גבולות המקטע כולו, כך שהפאנל המתקדם ממשיך לבחור אותה.

שדה החיפוש והפאנל המתקדם (איתור-סמן + ניווט בין מילים) עברו לצרוך
את ה-spans; הוסרו שלושת ה-indexOf על הטקסט המלא.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
במקטע מעורב — נורמליזציה משנת-אורך שגם מתפצל לכמה מילים
(רמב''ם-משה) — כל המילים קיבלו את טווח המקטע כולו והסמן על המאוחרת
בחר את הראשונה. עתה האיתור ממשיך אחרי כישלון: מילים מאותרות מקבלות
טווח מדויק, ורק הלא-מאותרת מקבלת את הפער שבין שכנותיה המאותרות.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
מסמך שנספר במנוע אך נכשל בשליפה מה-doc store הציג '3/4 תוצאות' עם
כפתור 'טען תוצאות נוספות (1)' שמסתובב לנצח בלי להביא כלום. כעת:
(1) בסיום חיפוש שהעמוד הראשון שלו כיסה את כל הספירה, המונה מיושר
למספר התוצאות שהתקבלו בפועל; (2) עמוד 'טען עוד' שחוזר ריק מיישר את
totalResults כך שהכפתור נעלם במקום להבטיח תוצאה שלא תגיע.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- תמיכה בכמה שמות בשאילתה אחת (מונח@ספר@ספר) עם איחוד ה-facets, ודיווח שגיאה מדויק על השמות שלא נמצאו.
- התאמת השם בשכבות כמו חיפוש הספרייה ואיתור מקורות: כותרת מדויקת > כינוי/ראשי-תיבות > הכלה > סלחנות לשגיאות כתיב (מרחק עריכה משותף עם findBooks).
- ספרי טקסט: קריאת BLOB ישירה מ-SQLite (בלי בניית Map/Line לכל שורה) והעברת
  הבייטים למנוע כמות-שהם (addTextBookBytes) — בלי המרת קידוד כפולה על הגשר
- PDF: המנוע מנרמל ומסנן זבל בעצמו (addPdfBook) — הוסרו הנרמול הכפול של
  _hasUsablePdfText, חמש העתקות התוכן וה-isolate כולו; טעינת עמודים במקבצים
  של 8 ו-prefetch של ה-PDF הבא במקביל לאינדוקס הנוכחי
- commit רק אחרי 100 ספרים שאונדקסו בפועל (הסף הישן ספר גם מדולגים ⇒ מאות
  commit-ים ריקים בסריקה של ספרייה כמעט-מאונדקסת) + מצב bulk במנוע
  (בלי מיזוגי-רקע; optimize בסוף ממזג ממילא)
- דילוגים שקטים ואירוע התקדמות אחת ל-25 בסריקה במקום לכל ספר
- לוגי תזמון מפורטים: טעינה/מנוע/חילוץ/commit/optimize פר-ספר וסיכום כולל

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
צריכת דגל ה-truncated החדש מהמנוע (SearchStreamUpdate.truncated): כשמסלול
המילה-היחידה חורג מתקציב איסוף הטרמים והתוצאות מוגשות בהרחבה חלקית (degrade),
מוצג באנר המציע לצמצם את החיפוש — במקום כישלון שקט.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
המנוע (efa10cb) הוסיף truncated נדרש ל-SearchPageResult; ה-fake gateways
בטסטים בונים אותו ישירות ונשברו קומפילציה. קוד הייצור רק קורא מהמבנה
ולא הושפע.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
המונה הראה 'ספרים שהושלמו' בעוד ה-overlay מופיע כבר בתחילת עיבוד
הספר, כך שהוא נראה תקוע על הספר הקודם לאורך כל עיבוד ספר גדול. עכשיו
onProgress מדווח את הספר הנוכחי (bookIndex+1) בתחילת עיבודו.

בעקבות זאת הוסר הקיצור processed>=total => IndexingComplete ב-bloc,
שהיה נפלט בתחילת הספר האחרון; ההשלמה נפלטת ממטפל העבודה אחרי commit
ו-optimize, כך שה-overlay לא נעלם מוקדם.

ספרי PDF נדחפים לסוף (orderBooksForIndexing) — חילוצם איטי בסדר גודל
מספרי טקסט, וכך שאר הספרייה זמינה לחיפוש מוקדם.
- מילים חילופיות נשמרות אוטומטית במאגר גלובלי (מילה->חלופות); מתג
  "חלופות שמורות" בדיאלוג מציג אותן ברשימה וממזג אותן לחיפוש, כבוי
  בכל חיפוש חדש
- תפריט סימון "ברירת מחדל לחיפוש חדש" לאפשרויות המתקדמות + לחצן
  "חזרה לברירת מחדל"; שינוי בחלונית נשמר לסשן בלבד
- עריכת חיפוש עברה מפאנל inline לדיאלוג החיפוש עם כותרת "עריכת חיפוש",
  מעדכנת את הטאב הקיים במקום; SearchEditPanel הוסר
- תיקון אובדן מצב חיפוש (מקורב/טווח) בשחזור בין הפעלות: ה-configuration
  מוזרקת בבנאי הטאב לפני AddTab במקום events אחרי השמירה
- צבעי מתגי הדיאלוג אוחדו ל-AppSurfaces.togglePill בשכבת ה-theme
נוספו קיצורי ניווט וסגירת טאב נוספים למסך החיפוש והעיון, כולל רישום בהגדרות הקיצורים ובמנגנון הוולידציה.

הורחבו בדיקות הקיצורים כדי לכסות מעבר לפי Ctrl+מספר, שחזור טאב, סגירת טאב במסך חיפוש ומניעת התנגשות ברישום הקיצורים.
palmoni5 added 7 commits July 10, 2026 15:42
נוספה בדיקה מהירה מול מנוע החיפוש שמזהה ספרים שכבר מאונדקסים לפי נתיבי הקבצים וטביעות התוכן, ומדלגת על אינדוקס מלא כאשר האינדקס תואם לספרייה.

עודכנו ספק הנתונים וריפוי האינדקס כדי לטפל בספרים חסרים, יתומים או בלתי ניתנים לאימות בצורה ממוקדת יותר, ונוספו בדיקות רגרסיה למסלולי reconcile וה-fast path.
חוברו מצבי קרבה חדשים לחיפוש המתקדם: מרווח מילים, אותה פסקה ותחת אותה כותרת, כולל העברת SearchScope דרך ה-Bloc, ה-repository ושער מנוע החיפוש.

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

שופרה טעינת תוצאות וספירות facets באמצעות stream משולב שמחזיר תוצאות, ספירה כוללת וספירה לפי ספרים באותו מסלול, כולל בדיקות רגרסיה לזרימת ה-facet counts.
נוסף כלי עזר שמסווג ספרי יסוד לפי נתיב קטגוריה וכותרת, כולל הבחנה בין מקורות ראשיים לבין פירושים וספרות עזר.

הסיווג מכסה תנ״ך, משנה, תלמודים, מדרשי הלכה ואגדה, זהר וספרי הלכה מרכזיים, ומשאיר כ-null ספרים שאינם שייכים לרשימת ספרי היסוד.
נוספו ברירות מחדל נפרדות לאפשרויות החיפוש הרגיל והמתקדם, כולל שמירת מצב סשן לפי מצב חיפוש ומניעת מחיקה לא מכוונת של אפשרויות גלובליות בעת סגירת שדה החיפוש.

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

עודכנו דיאלוג החיפוש והבדיקות כדי לכסות מעבר בין מצבי חיפוש, שחזור ברירות מחדל וסינון פרמטרים לפי מצב.
המנוע קורא רק מנתיב קובץ, לכן שני ה-assets המוטמעים (dictionary.json,
Acronyms.json) מחולצים לדיסק תחת dictionaries/ — כתיבה מחדש רק כשהתוכן
השתנה (השוואת בייטים מלאה). best-effort: כשל אינו שובר את אתחול המנוע.
- אפשרויות בלעדיות למצב המתקדם (advancedOnlyWordOptionKeys): קידומות
  ארמיות, סיומות ארמיות, התעלם מגרשיים, תרגום ארמי, ראשי תיבות —
  בגריד האפשרויות, בתפריט ברירות המחדל, בקיצורי הצ'יפים וב-overlay
  שדה החיפוש (שם רק במצב מתקדם).
- החיפוש הרגיל מסנן כעת לפי exactWordOptionKeys גם בנרמול הפרמטרים —
  מצב משוחזר עם קידומות/סיומות כלליות או אפשרויות מתקדם לא ידלוף אליו.
- עדכון הבדיקות לסמנטיקה החדשה.
- קידומות מודגשות: בדיקת גבול-המילה נעשית בקצוות ההתאמה כולה, כך ש"מיעוט"
  בתוך "במיעוט" אינו נדחה.
- הדגשה מבוססת-אינדקס מתרעננת אחרי הרינדור הראשוני: highlightPatternRevision,
  מפתח מטמון רינדור מודע-גרסה והאזנה ב-SmartTextWidget — כך שווריאנטים שהגיעו
  אסינכרונית מהמנוע מודגשים בלי גלילה.
- סרגל התוצאות (חיפוש בתוך ספר) מדגיש רק את החלק שהוקלד באמצעות
  computeHighlightRanges/spansFromRanges, ומתרענן עם התבנית המדויקת.
- שחזור אפשרויות פר-מילה בעריכה חוזרת של חיפוש בתוך ספר (useGlobalSearchOptions).
- בדיקות: גבול-מילה בקידומות, revision, spansFromRanges/htmlToPlainText, שחזור פרמטרים.
@palmoni5 palmoni5 force-pushed the cherry-pick-commits branch from ca4ae77 to caf2754 Compare July 10, 2026 12:43
palmoni5 and others added 3 commits July 11, 2026 23:58
- אינדוקס: BookFacetMetadataCache מזין למנוע facets ממדיים מ-SQLite
  (book_author, generation, isBaseBook + מסווג ספרי היסוד); המסווג תומך
  עתה גם בנתיבי slash וגם בפסיק.
- סינון: חלונית "תקופה, מחבר וספרי יסוד" בדיאלוג החיפוש ובסרגל התוצאות
  (SearchDimensionControls משותף) — OR בתוך ממד, AND בין ממדים ומול
  הקטגוריות; עץ הקטגוריות מבודד מהממדים ומשמר אותם; העדפות נשמרות.
- איחוד תוצאות: בורר "איחוד תוצאות" (ללא/לפי סעיף/טקסט זהה), כרטיס מאוחד
  עם "נמצאו X תוצאות בטווח זה" ורשימת מיקומים נפתחת; המונים והדפדוף
  נספרים בקבוצות (totalGroups/displayTotal); סינון-קטגוריה מקומי מנוטרל
  במצב איחוד וחוזר למנוע.
- PDF: פריט "חפש מקבילות" בתפריט בחירת טקסט — מריץ את הקטע הנבחר כחיפוש
  על כל הספרייה.
- תיקונים: התנגשות PageStorage שתקעה את פאנל הסינון (bool מול double),
  assertion של SwitchListTile על רקע מעוצב, שחזור _buildBooksByCatalogueOrder
  החסר, ועדכון טסטים ל-API החדש של המנוע (mergedCount/merged/grouping).

דורש otzaria_search_engine עם facets ממדיים ו-ResultGrouping (טרם פורסם;
בפיתוח — dependency_override מקומי) ובניית אינדקס מחדש.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
foldQuoteForms מקפל גם את הצורות הטיפוגרפיות של Word/OCR
(U+2018/U+2019/U+201C/U+201D) באותו מיפוי כמו sanitize_query
ב-Rust, כך שבחירת מילה לפי סמן במילים כמו רמח"ל בכתיב
טיפוגרפי מקבלת טווח מדויק במקום גבולות המקטע כולו.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

חיפוש ישיר בספר ספציפי שיפור האפשרות לחיפוש חוזר והיסטוריית חיפושים עריכת חיפוש

1 participant