Skip to content
palmoni5 edited this page Jul 18, 2026 · 2 revisions

חיפוש מלא־טקסט

מנוע החיפוש של אוצריא בנוי משכבת Rust‏ (tantivy) ושכבת Dart ב־lib/search/.

השכבות

  • מנוע — חבילת pub חיצונית otzaria_search_engine (‏Rust/tantivy, בריפו נפרד). המורפולוגיה העברית/ארמית — קידומות, סיומות, כתיב מלא/חסר, שגיאות כתיב, ראשי תיבות, תרגום ארמי — ממומשת בתוך ה־Rust. רשימת הקידומות/הסיומות המלאה והסמנטיקה של שילובן (קידומות בלבד / סיומות בלבד / שתיהן) מתועדת ב־docs/hebrew_morphology_search.md.
  • SearchRepository — ה־API הראשי: ‏searchTexts, ‏searchTextsStream, ‏searchTextsStreamWithCounts ועוד, עם עשרות פרמטרים (facets‏, fuzzy‏, distance‏, scope‏, מילים חלופיות, שאילתה שלילית, ניקוד/טעמים, קיבוץ).
  • SearchEngineGateway — בקשה אחידה (SearchEngineRequest) וניתוב לפי מצב. נקודה חשובה: חיפוש "מדויק" עם מרווח/אפשרויות מנותב בפועל למסלול המתקדם של המנוע.
  • SearchQueryBuilder — עיבוד קלט: ‏splitQueryWords/sanitizeQuery מואצלים למנוע ה־Rust — מקור אמת יחיד לטוקניזציה, כדי שהאינדוקס והשאילתה יהיו זהים תו־בתו.

שלושת מצבי החיפוש

מצב תיאור
מדויק (exact) ברירת המחדל — המילים בסדרן
מתקדם (advanced) ‏scope (מרווח מילים/פסקה/כותרת), מצב התאמת מילים (כולן/אחת/רוב/לפחות N), מילים חלופיות (OR), מרווחים ידניים, שאילתה שלילית
מקורב (fuzzy) מרחק עריכה 0–2

SearchBloc — הזרימה מקצה לקצה

הליבה היא _onUpdateSearchQuery:

  1. מזהה בקשה (_searchRequestId) — מניעת תוצאות מיושנות.
  2. ‏stream משולב searchTextsStreamWithCountsמעבר אינדקס אחד מחזיר: ספירה כוללת + ספירה פר־ספר + תוצאות ב־chunks של 50 (במקום שלוש ריצות נפרדות).
  3. ספירת facets — אם החיפוש רץ על אותו היקף, ה־stream משרת גם את עץ הקטגוריות; רק בתת־בחירה נדרשת ספירה נפרדת.
  4. חתימת קלטים (_facetCountsSignature) — מאפשרת סינון מקומי מיידי (client-side) בלחיצה על קטגוריה מצמצמת כשכל התוצאות כבר בזיכרון.
  5. resultsTruncated — דגל תוצאות חלקיות; LoadMoreResults — דפדוף.

Facets — סינון לפי קטגוריות וממדים

  • BookFacet.buildFacetPath — נתיב facet: ‏<נתיב קטגוריה>/<מפתח ספר>. מפתח הספר ייחודי: ‏id:<id> (רשמי) / uid:<id> (אישי) / ext:<id> (חיצוני) / הרכבה מנתונים.
  • ממדי סינון (FacetHelper) — שורשים באנגלית: ‏/base (ספרי יסוד), ‏/era/<תקופה>, ‏/author/<מחבר>. ‏OR בתוך ממד, ‏AND בין ממדים.
  • foundational_book_classifier.dart — מסווג ספרי יסוד ל־10 דרגות (תנ"ך=1, משנה=2, בבלי=3 … שו"ע=10).
  • העדפות היקף נשמרות ב־SearchScopePreferences (חפש בהכל / בחירה ידנית / ממדים — במפתחות נפרדים).

סדר התוצאות

SearchCatalogueOrderHelper משחזר את סדר עץ הספרייה (17 קטגוריות ראשיות בסדר קבוע: תנ"ך, מדרש, משנה, תלמוד בבלי…) ובונה מפת סדר ב־DFS. אותו סדר משמש גם את האינדוקס (catalogueOrder).

תחביר @ וכלי עזר

  • category_query_parser.dart — תחביר מונח@שם@שם לצמצום החיפוש לספר/קטגוריה, כולל כינויים ושגיאות כתיב.
  • snippet_builder.dart — בניית קטעי תצוגה עם הדגשות.
  • find_match_utils.dart — נרמול עברי להתאמות.
  • enhanced_search_field.dart — שדה החיפוש עם overlay אפשרויות.

חיפוש גימטריה — lib/tools/gematria/

GimatriaSearch — שלוש שיטות: רגילה, קטנה (מודולו), אותיות סופיות (ך=500…). מחפש ביטויים ששווי הגימטריה שלהם שווה ליעד, עם "עם הכולל", "פסוק שלם בלבד", וחלון גלישה של עד 8 מילים. מסלול ראשי דרך SQLite עם fallback לסריקת קבצים.

דפים קשורים

Clone this wiki locally