שאילתות — match, term, range ו-bool
מה זה?
בשיעורים הקודמים ראינו טעימות מ-match ו-term. עכשיו — התמונה המלאה: match לחיפוש חכם על text, term להתאמה מדויקת על keyword, range לטווחים מספריים/תאריכים, ו-bool לשילוב כמה תנאים יחד — בדיוק כמו &/| ב-Pandas, או Where מורכב ב-LINQ, רק בתחביר JSON ייעודי ל-Elasticsearch.
מילות מפתח שחשוב לזכור
• match — חיפוש חכם על שדה text; מוצא מסמכים שמכילים חלק מהמילים, מדורגים לפי רלוונטיות
• term — התאמה מדויקת על שדה keyword (או מספר/בוליאני); לא “מבין” משמעות, רק שוויון מדויק
• range — סינון לפי טווח (gte, lte, gt, lt) — מספרים, תאריכים
• bool — שילוב כמה תנאים: must (חובה, כמו AND), should (מומלץ, כמו OR), must_not (שלילה)
// match — smart search
GET /products/_search
{
"query": { "match": { "name": "running shoes" } }
}
// finds documents that contain at least some of the words, ranked by how many words match// range — price range
GET /products/_search
{
"query": {
"range": { "price": { "gte": 100, "lte": 500 } }
}
}
// only products priced between 100 and 500// bool — combining conditions, like a compound Where in LINQ
GET /products/_search
{
"query": {
"bool": {
"must": [
{ "match": { "name": "shoes" } }
],
"filter": [
{ "term": { "category": "Footwear" } },
{ "range": { "price": { "lte": 500 } } }
],
"must_not": [
{ "term": { "inStock": false } }
]
}
}
}
// must contain "shoes" in the name, be in the "Footwear" category, cost up to 500, and not be out of stockהסבר עיקרי
must מול filter — שניהם “חובה” (כמו AND), אבל must משפיע על הדירוג (Relevance Score — כמה טוב ההתאמה), בעוד filter רק מסנן, בלי להשפיע על הדירוג — ומהיר יותר כי Elasticsearch יכול לשמור אותו ב-Cache. הכלל המעשי: תנאי טקסט חופשי (match) שמשפיע על “כמה רלוונטי” שייך ל-must; תנאי מדויק (קטגוריה, טווח מחיר) שרק “כן/לא” שייך ל-filter.
bool הוא בדיוק כמו &/| ב-Pandas — must (כולם חייבים להתקיים) מקביל ל-&; should (לפחות אחד, ותורם לדירוג אם יש יותר) מקביל בערך ל-| עם משקל; must_not הוא שלילה מפורשת. השם שונה, הרעיון הלוגי (AND/OR/NOT) זהה לגמרי לכל מה שכבר נלמד.
range על תאריכים עובד כמו על מספרים — {"range": {"publishDate": {"gte": "2026-01-01"}}} מסנן לפי תאריכים בדיוק כמו טווח מחירים — כל עוד השדה מוגדר כ-date ב-Mapping (מה שנלמד בשיעור הראשון של היחידה).
יתרונות
match/term/range מכסים את רוב תרחישי החיפוש הבסיסיים בממשק ברור; bool משלב תנאים מורכבים בקריאות טובה; הפרדת must/filter נותנת גם דיוק דירוג וגם ביצועים טובים.
חסרונות
תחביר JSON מקונן (bool בתוך query בתוך הבקשה) יכול להיות מסורבל לקריאה עם הרבה תנאים; שימוש שגוי ב-must במקום filter (או להפך) פוגע בביצועים או בדירוג בלי שגיאה גלויה.
נקודות חשובות
• match = חיפוש חכם על text; term = התאמה מדויקת על keyword
• range = טווחים, עם gte/lte/gt/lt
• bool משלב: must≈AND (משפיע על דירוג), filter≈AND (לא משפיע, מהיר יותר), must_not≈NOT
• filter עדיף על must כשלא צריך את התנאי להשפיע על דירוג רלוונטיות
טעויות נפוצות
• להשתמש ב-term על שדה text — לרוב לא מוצא כלום כי השדה מנותח, לא שלם
• לשים כל תנאי תחת must גם כשהוא לא צריך להשפיע על דירוג — פגיעה בביצועים מיותרת
• לשכוח ש-range על תאריכים דורש פורמט תאריך תואם למה שהוגדר ב-Mapping
סיכום
match מבצע חיפוש חכם על שדות text; term מבצע התאמה מדויקת על keyword; range מסנן לפי טווחים מספריים/תאריכים. bool משלב את כולם — must/filter (AND, כאשר filter לא משפיע על דירוג ומהיר יותר), should (OR), ו-must_not (NOT). זהו ארגז הכלים המרכזי לכל שאילתת חיפוש אמיתית ב-Elasticsearch.
דוקומנטציה רשמית
תרגילים
תרגיל 1 — match ו-range נפרדים
המשימה: על Index products, כתבו שאילתת match שמוצאת מוצרים לפי מילה בשם, ושאילתת range נפרדת שמוצאת מוצרים בטווח מחירים.
בדיקה: כל שאילתה מחזירה תוצאות נכונות בנפרד.
תרגיל 2 — bool משולב
המשימה: שלבו את שתי השאילתות מתרגיל 1 יחד עם bool, כאשר החיפוש בשם ב-must והטווח ב-filter.
בדיקה: התוצאה כוללת רק מוצרים שעונים על שני התנאים יחד.
פרויקט מסכם
המשימה: בנו endpoint חיפוש “מתקדם” ל-Index Articles (מהפרויקט המסכם הקודם).
דרישות:
matchעלcontent/titleלפי מונח חיפוש חופשי מהמשתמשfilterעםtermעלtags(סינון קטגוריה) ו-rangeעלpublishDate(טווח תאריכים)must_notשמסנן החוצה מאמרים עם תג"archived"
בדיקה: שאילתה עם כל התנאים יחד מחזירה רק מאמרים שעונים על כולם בו-זמנית; שינוי כל תנאי בנפרד משנה את התוצאה בהתאם.
מה בפרק הבא
בפרק הבא — Aggregations: איך מחשבים סטטיסטיקה על תוצאות חיפוש (ממוצע, קיבוץ, ספירה) — בדיוק כמו GroupBy/agg שכבר מוכר, בתחביר Elasticsearch.