חיפוש#543
Open
palmoni5 wants to merge 30 commits into
Open
Conversation
palmoni5
commented
Jul 5, 2026
Collaborator
- העברת רג'קס הדגשת התוצאות למנוע
- האצלת עיבוד הטקסט של החיפוש למנוע: נרמול, טוקניזציה והדגשה ליטרלית
2a9b682 to
17bb4b4
Compare
b2a556d to
15a3403
Compare
This was
linked to
issues
Jul 6, 2026
Open
29331d6 to
ca4ae77
Compare
הרג'קסים האחרונים שנגזרים משאילתת חיפוש עוברים לצריכה מהמנוע (מקור אמת יחיד), כך שנרמול האינדוקס, פירוק השאילתה וההדגשות לא יכולים לסטות זה מזה: - 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+מספר, שחזור טאב, סגירת טאב במסך חיפוש ומניעת התנגשות ברישום הקיצורים.
נוספה בדיקה מהירה מול מנוע החיפוש שמזהה ספרים שכבר מאונדקסים לפי נתיבי הקבצים וטביעות התוכן, ומדלגת על אינדוקס מלא כאשר האינדקס תואם לספרייה. עודכנו ספק הנתונים וריפוי האינדקס כדי לטפל בספרים חסרים, יתומים או בלתי ניתנים לאימות בצורה ממוקדת יותר, ונוספו בדיקות רגרסיה למסלולי 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, שחזור פרמטרים.
ca4ae77 to
caf2754
Compare
- אינדוקס: 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.