מה זה?

חיפוש “מוצרים עם ‘נעל’ בתיאור” ב-SQL עם WHERE Description LIKE '%נעל%' עובד — עד שרוצים “נעליים” למצוא גם “נעל” (ריבוי/יחיד), התעלמות משגיאות כתיב קלות, או דירוג תוצאות לפי רלוונטיות. LIKE פשוט לא בנוי לזה — הוא בודק התאמת תווים מדויקת, לא משמעות. Elasticsearch פותר את זה: מנוע חיפוש ייעודי (Information Retrieval), עם אינדוקס טקסט חכם שמבין מילים, לא רק תווים.

מילות מפתח שחשוב לזכור

• Information Retrieval — תחום שעוסק במציאת מידע רלוונטי מתוך כמות גדולה של טקסט, כולל דירוג לפי רלוונטיות

• Document — יחידת נתונים ב-Elasticsearch (דמוי-JSON, בדיוק כמו MongoDB) שמאונדקסת לחיפוש

• Index — אוסף Documents עם מבנה דומה — מקביל רופף ל-Collection ב-MongoDB / Table ב-SQL

• Mapping — הגדרת הסכמה של Index — אילו שדות קיימים ובאיזה טיפוס (text, keyword, date, integer)

// Document in Elasticsearch — JSON-like, just like MongoDB
{
  "name": "Adidas running shoes",
  "description": "Light and comfortable shoes for everyday running",
  "price": 349.90,
  "category": "Footwear",
  "inStock": true
}
// Mapping — defining the Index schema, before adding Documents
PUT /products
{
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "price": { "type": "float" },
      "category": { "type": "keyword" },
      "inStock": { "type": "boolean" }
    }
  }
}

הסבר עיקרי

Document/Index דומים למה שכבר מוכר, אך למטרה שונה — Document ב-Elasticsearch נראה בדיוק כמו Document ב-MongoDB (JSON גמיש) — אבל המטרה שונה לגמרי: MongoDB מותאם לאחסון ושליפה מהירה לפי מפתח; Elasticsearch מותאם לחיפוש טקסט חכם בתוך תוכן המסמכים. אותה צורת נתונים, שימוש שונה לחלוטין.

Mapping הוא כמו סכמת EF Core, אבל לחיפוש לא רק לאחסון — Mapping קובע לא רק איזה טיפוס לכל שדה, אלא איך לחפש בו — שדה text מנותח למילים בודדות לחיפוש חכם; שדה keyword נשמר כמחרוזת שלמה ומדויקת (לא מפורק) — נושא שיורחב בשיעור הבא. זו החלטה קריטית בזמן יצירת ה-Index, לא רק “עוד טיפוס נתונים”.

למה לא SQL — SQL מצוין לשאילתות מדויקות (“כל ההזמנות של לקוח X”) אך לא בנוי לדרג “כמה רלוונטי” טקסט חופשי הוא לשאילתה. Elasticsearch בנוי מהיסוד סביב Inverted Index (מבנה נתונים שממפה כל מילה לכל המסמכים שמכילים אותה) — מה שהופך חיפוש טקסט מסובך למהיר וחכם, במחיר של פחות התאמה לעדכונים תכופים-מאוד או עקביות טרנזקציונית חזקה (כמו SQL).

יתרונות

Elasticsearch מבין משמעות טקסט (לא רק התאמת תווים), ומדרג תוצאות לפי רלוונטיות; מהיר משמעותית מ-LIKE על טקסט חופשי בכמויות גדולות; Mapping גמיש מאפשר סוגי חיפוש שונים לכל שדה.

חסרונות

Elasticsearch לא מתאים כ-DB ראשי לנתונים טרנזקציוניים (כמו הזמנות/תשלומים) — משמש בדרך כלל לצד DB אמיתי, לא כתחליף לו; דורש תשתית וניהול נוספים (כמו MongoDB/Kafka שכבר נלמדו).

נקודות חשובות

• Elasticsearch מתמחה בחיפוש טקסט חכם, לא רק אחסון — Information Retrieval

• Document/Index דומים ל-MongoDB במבנה, שונים לגמרי במטרה

• Mapping קובע איך כל שדה מאונדקס לחיפוש — text (מפורק למילים) מול keyword (מדויק שלם)

• Elasticsearch משלים DB אמיתי (SQL/NoSQL), לרוב לא מחליף אותו

טעויות נפוצות

• לחשוב ש-Elasticsearch הוא “עוד NoSQL DB” כמו MongoDB — הוא מנוע חיפוש, לא DB ראשי לנתונים טרנזקציוניים

• לבחור Mapping שגוי לשדה (keyword כשרוצים חיפוש טקסט חכם, או ההפך) — משפיע ישירות על איכות החיפוש

• לצפות ש-LIKE ב-SQL ייתן תוצאות דומות ל-Elasticsearch — הן פותרות בעיות שונות במהותן

סיכום

Elasticsearch הוא מנוע Information Retrieval — מותאם לחיפוש טקסט חכם ומדורג-רלוונטיות, לא רק אחסון ושליפה. Documents דמויי-JSON מאונדקסים ב-Index, עם Mapping שקובע איך כל שדה נבדק בחיפוש. הוא לא מחליף SQL/NoSQL קיים — הוא משלים אותם כשצריך יכולות חיפוש טקסט שהם לא בנויים לספק ביעילות.

דוקומנטציה רשמית

Elasticsearch — Documentation


תרגילים

תרגיל 1 — יצירת Index עם Mapping

המשימה: צרו Index בשם books עם Mapping הכולל title (text), author (keyword), publishYear (integer).

בדיקה: ה-Index נוצר בהצלחה עם המבנה המוגדר, ניתן לאימות עם GET /books/_mapping.

תרגיל 2 — הוספת Documents

המשימה: הוסיפו 5 ספרים ל-Index books שיצרתם, עם כותרות מגוונות.

בדיקה: GET /books/_search (בלי תנאי) מחזיר את כל 5 הספרים.


פרויקט מסכם

המשימה: תכננו ויישמו Mapping מלא ל-Index “מאמרים” (Articles) שמתאים לחיפוש תוכן.

דרישות:

  1. שדות: title (text), content (text), author (keyword), publishDate (date), tags (keyword)
  2. נמקו בקצרה (בתיעוד) למה כל שדה קיבל את הטיפוס שקיבל
  3. הוסיפו 5 מאמרים לדוגמה עם תוכן מגוון

בדיקה: ה-Mapping נוצר בהצלחה; שליפת כל המאמרים (_search בלי תנאי) מחזירה את כל 5 בהצלחה.

מה בפרק הבא

בפרק הבא — text מול keyword: ההבדל הקריטי בין שני סוגי השדות הטקסטואליים, ואיך הבחירה הלא-נכונה שוברת חיפוש או מיון.