# מבוא ל-Elasticsearch — Document, Index ו-Mapping📖 שיעור

## מה זה?

חיפוש "מוצרים עם 'נעל' בתיאור" ב-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`)

```json
// 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
}
```

```json
// 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](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html)

---

## תרגילים

### תרגיל 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**: ההבדל הקריטי בין שני סוגי השדות הטקסטואליים, ואיך הבחירה הלא-נכונה שוברת חיפוש או מיון.
