משתמש שממתין 200 אלפיות שנייה לתגובת השלמה אוטומטית הורג את חווית המשתמש. בפרויקט מסחר אלקטרוני אלקטרוני אחד, כל תו שהוקלד הפעיל שאילתת חיפוש טקסט מלא מול מסד הנתונים. עומס השרת גדל, המהירות ירדה, ולקוחות עזבו. הפתרון — Elasticsearch Completion Suggester. מנגנון זה, המבוסס על FST (Finite State Transducer), מאחסן נתונים בזיכרון ומחזיר תגובות תוך 1–5 אלפיות שנייה. יישמנו אותו ביותר מ-50 פרויקטים במשך למעלה מ-10 שנים ואנו מבטיחים ביצועים יציבים תחת עומס.
מדריך זה מכסה הגדרת השלמה אוטומטית של Elasticsearch באמצעות Completion Suggester, תוך השוואה עם Edge N-gram. איך זה עובד: אתה מקליד "no" — המערכת מחזירה "notebook", "socks", "november" ללא דיחוי. ה-suggester משתמש בשדה completion המכיל מערך input (אפשרויות השלמה) ו-weight אופציונלי (עדיפות). עבור מוצרים פופולריים, המשקל נקבע על סמך מכירות או קליקים.
כיצד ליישם Completion Suggester להשלמה אוטומטית?
שלב 1: הגדרת ה-Mapping
Completion Suggester הוא האפשרות המהירה ביותר אך פחות גמישה: ללא ניקוד טקסט מלא, סינון מוגבל. Mapping עבור שדה completion:
PUT /products
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"suggest": {
"type": "completion",
"analyzer": "simple",
"search_analyzer": "simple",
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
}
}
}
} שלב 2: אינדוקס מסמכים עם משקלים
אינדוקס מסמך עם משקל (לדוגמה, גבוה יותר עבור מוצרים פופולריים):
PUT /products/_doc/1
{
"title": "Ноутбук ASUS VivoBook 15",
"suggest": {
"input": ["Ноутбук ASUS VivoBook", "ASUS VivoBook 15", "VivoBook"],
"weight": 10
}
} שלב 3: שאילתה עם Fuzzy ודילוג על כפילויות
שאילתת השלמה אוטומטית עם fuzzy:
POST /products/_search
{
"suggest": {
"product-suggest": {
"prefix": "ноут",
"completion": {
"field": "suggest",
"size": 5,
"skip_duplicates": true,
"fuzzy": {
"fuzziness": 1
}
}
}
},
"_source": ["title", "price"],
"size": 0
}התגובה מחזירה אפשרויות עם שדות PUT /products { "mappings": { "properties": { "title": { "type": "text" }, "suggest": { "type": "completion", "analyzer": "simple", "search_analyzer": "simple", "preserve_separators": true, "preserve_position_increments": true, "max_input_length": 50 } } } } . זמן תגובה — 1–5 אלפיות שנייה.
בחירה בין Completion Suggester ל-Edge N-gram
הבחירה תלויה בעדיפות: מהירות מול גמישות. ה-suggester מהיר פי 10 מ-N-gram תחת אותו עומס — אושר על ידי מבחני העומס שלנו. אם הנתונים שלך סטטיים (קטלוג מוצרים, רשימת ערים) ונדרשת מהירות מקסימלית — בחר בו. אם נדרש חיפוש טקסט מלא עם סינון ומיון — Edge N-gram.
מהו Context Suggester וכיצד להשתמש בו?
Context Suggester מרחיב את מנגנון ההשלמה עם סינון לפי הקשר — לדוגמה, לפי קטגוריית מוצר. Mapping עם הקשר:
PUT /products
{
"mappings": {
"properties": {
"suggest": {
"type": "completion",
"contexts": [
{
"name": "category",
"type": "category",
"path": "category"
}
]
},
"category": {
"type": "keyword"
}
}
}
}אינדוקס עם הקשר:
PUT /products/_doc/1
{
"title": "Ноутбук ASUS",
"category": "laptops",
"suggest": {
"input": ["Ноутбук ASUS", "ASUS"],
"contexts": {
"category": ["laptops"]
}
}
}שאילתה עם הקשר ו-boost:
POST /products/_search
{
"suggest": {
"product-suggest": {
"prefix": "ас",
"completion": {
"field": "suggest",
"size": 5,
"contexts": {
"category": [
{
"context": "laptops",
"boost": 2
},
{
"context": "tablets"
}
]
}
}
}
}
}Context Suggester מגדיל את הרלוונטיות: אם המשתמש נמצא בקטע "מחשבים ניידים", ההצעות מציגות רק מחשבים ניידים. בפרויקט אחד, השגנו עלייה של 30% בשיעור הקליקים על הצעות בזכות הדיוק.
מהן המגבלות של Completion Suggester?
Edge N-gram: חלופה עם חיפוש טקסט מלא
Edge N-gram ממפה אסימונים חלקיים (אורך מינימלי של 2 תווים) ומשתמש בשאילתת PUT /products/_doc/1 { "title": "Ноутбук ASUS VivoBook 15", "suggest": { "input": ["Ноутбук ASUS VivoBook", "ASUS VivoBook 15", "VivoBook"], "weight": 10 } } סטנדרטית עם ניקוד TF/IDF מלא, סינון ומיון. דוגמת mapping:
PUT /products
{
"settings": {
"analysis": {
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 20,
"token_chars": ["letter", "digit"]
}
},
"analyzer": {
"autocomplete_index": {
"type": "custom",
"tokenizer": "edge_ngram_tokenizer",
"filter": ["lowercase"]
},
"autocomplete_search": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase"]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "autocomplete_index",
"search_analyzer": "autocomplete_search"
}
}
}
}שאילתה:
POST /products/_search
{
"query": {
"match": {
"title": {
"query": "ноут",
"operator": "and"
}
}
},
"sort": [
{
"_score": "desc"
}
],
"size": 5
} | תכונה | Completion Suggester | Edge N-gram |
|---|---|---|
| מהירות תגובה | 1–5 אלפיות שנייה | 10–50 אלפיות שנייה |
| גמישות שאילתה | מוגבלת (prefix) | מלאה (match, סינון, מיון) |
| שימוש בזיכרון | גבוה (FST) | בינוני (אינדקס הפוך) |
| תמיכה בשגיאות כתיב | fuzzy מובנה | דורש מנתח נפרד |
| מקרה שימוש מומלץ | נתונים סטטיים עם משקלים | נתונים דינמיים עם חיפוש טקסט מלא |
טעויות נפוצות בהגדרת השלמה אוטומטית
- שכחת
POST /products/_search { "suggest": { "product-suggest": { "prefix": "ноут", "completion": { "field": "suggest", "size": 5, "skip_duplicates": true, "fuzzy": { "fuzziness": 1 } } } }, "_source": ["title", "price"], "size": 0 }: בלעדיו, אפשרויות כפולות עשויות להופיע. - אי הגדרת
_source— ברירת המחדל היא 50, עשויה להיות לא מספקת עבור שמות ארוכים. - שימוש ב-
PUT /products { "mappings": { "properties": { "suggest": { "type": "completion", "contexts": [ { "name": "category", "type": "category", "path": "category" } ] }, "category": { "type": "keyword" } } } }בשאילתה הראשית אך שכחתPUT /products/_doc/1 { "title": "Ноутбук ASUS", "category": "laptops", "suggest": { "input": ["Ноутбук ASUS", "ASUS"], "contexts": { "category": ["laptops"] } } }— שדות נוספים מוחזרים. - אי הגדרת debounce בקצה הקדמי: שליחת בקשה על כל תו יוצרת מבול בקשות. אנו ממליצים על השהיה של 200–300 אלפיות שנייה וקאשינג של תוצאות קודמות.
דוגמת יישום בצד השרת
דוגמה ב-PHP באמצעות POST /products/_search { "suggest": { "product-suggest": { "prefix": "ас", "completion": { "field": "suggest", "size": 5, "contexts": { "category": [ { "context": "laptops", "boost": 2 }, { "context": "tablets" } ] } } } } } :
public function autocomplete(string $query): array
{
$response = $this->client->search([
'index' => 'products',
'body' => [
'suggest' => [
'product-suggest' => [
'prefix' => mb_strtolower($query),
'completion' => [
'field' => 'suggest',
'size' => 8,
'skip_duplicates' => true,
'fuzzy' => ['fuzziness' => 'AUTO'],
]
]
],
'_source' => ['title', 'slug', 'price'],
'size' => 0,
]
]);
return array_map(
fn($opt) => [
'title' => $opt['text'],
'url' => '/products/' . $opt['_source']['slug'],
'price' => $opt['_source']['price'],
],
$response['suggest']['product-suggest'][0]['options'] ?? []
);
}בקצה הקדמי, הקפד להוסיף debounce של 200–300 אלפיות שנייה ולשמור תוצאות קודמות במטמון כדי להימנע מעומס על השרת.
מה כלול בפתרון ההשלמה האוטומטית שלנו
חבילת היישום המלאה שלנו להשלמה אוטומטית כוללת:
- ניתוח דרישות ובחירת המנגנון האופטימלי (Completion Suggester מול Edge N-gram)
- עיצוב mapping והגדרת אינדקס
- יישום נקודת קצה API עם תמיכה ב-fuzzy והקשר
- אינטגרציה בקצה הקדמי (debounce, קאשינג)
- תיעוד מלא וגישה למאגר הקוד
- הדרכה למפתחים שלך
- חודש תמיכה לאחר העלייה לאוויר
- התחייבות לזמן תגובה של פחות מ-5 אלפיות שנייה
תמחור: הגדרת Completion Suggester בסיסית מתחילה ב-$500. פתרון מלא עם Context Suggester ו-Edge N-gram נע בין $1,000 ל-$2,000, תלוי במורכבות. חיסכון אופייני מהפחתת עומס השרת ושיפור שיעורי ההמרה יכול לעלות על $5,000 בחודש עבור אתרי מסחר אלקטרוני עם תעבורה גבוהה.
לוח זמנים: אנו יכולים להגדיר השלמה אוטומטית בסיסית תוך יום אחד. הוספת Context Suggester אורכת חצי יום נוסף. אינטגרציה מלאה של Edge N-gram עם כל התכונות דורשת 1–2 ימים. צור קשר להערכת פרויקט חינמית — נעריך את הצרכים המדויקים שלך ונספק מחיר קבוע.
תיעוד רשמי של Elasticsearch ממליץ להשתמש ב-Completion Suggester לתרחישי השלמה אוטומטית במהירות גבוהה.







