טכנולוגיה ותשתית * Elasticsearch וחיפוש טקסט מלא
שמיעה אלסטית וחיפוש טקסט מלא
1) תפקיד Elasticsearch
Elasticsearch (בקיצור: ES) היא מערכת חיפוש וניתוח מבוזרת המבוססת על אינדקסים הפוכים ומבני עמודות. זה נותן:- טקסט מלא: רלוונטיות (BM25), מורפולוגיה, מעורפל/typo סובלני.
- היבטים וצבירות: פרוסות מהירות על ידי תכונות.
- חיפוש היברידי: BM25 + וקטור kNN (סמנטיקה).
- מהירות פיתוח: Query DSL, בלע צינורות, מערכת אקולוגית עשירה.
עבור iGaming/fintech: חיפוש אחר משחקים/ספקים, פרומואים וכללים, היבטים המהירים (ספק, תנודתיות, RTP, שפה), חיפוש אחר מגזיני KYC/AML, פריסת יומנים והתראות.
2) מודל נתונים ומפיות
2. אינדקס שדה וסוגים 1
טקסט לטקסט מלא.
'keyword' ערכים מדויקים/אגרגציות/סוג.
"דייט", "ארוך/כפול", "בוליאני", "ip", "geo _ point'.
'מקונן' - מערך של אובייקטים עם קורלציית שדה נכונה.
'dense _ vector' - ייצוג וקטורי (שיבוץ).
2. 2 אסטרטגיה רב ־ תחומית
לאחסן את השדה בכמה תצוגות: 'שם. טקסט, 'שם. גולמי (מילת מפתח), 'שם. nam '(להשלמה אוטומטית).
json
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ru_morph",
"fields": {
"raw": { "type": "keyword", "ignore_above": 256 },
"ngram": { "type": "text", "analyzer": "edge_ngram_2_20" }
}
},
"provider": { "type": "keyword" },
"tags": { "type": "keyword" },
"rtp": { "type": "float" },
"released_at": { "type": "date" },
"lang": { "type": "keyword" },
"embedding": { "type": "dense_vector", "dims": 384, "index": true, "similarity": "cosine" }
}
},
"settings": {
"analysis": {
"filter": {
"ru_stop": { "type": "stop", "stopwords": "_russian_" },
"ru_stemmer": { "type": "stemmer", "language": "russian" },
"syn_ru": { "type": "synonym", "lenient": true, "synonyms": [
"слот,игровой автомат => слот",
"джекпот,суперприз => джекпот"
] }
},
"analyzer": {
"ru_morph": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "ru_stop", "ru_stemmer", "syn_ru"]
},
"edge_ngram_2_20": {
"type": "custom",
"tokenizer": "edge_ngram",
"filter": ["lowercase"],
"char_filter": [],
"tokenizer": "edge_ngram"
}
},
"tokenizer": {
"edge_ngram": { "type": "edge_ngram", "min_gram": 2, "max_gram": 20 }
}
}
}
}
2. 3 מקונן עבור היבטים
מאפייני הצורה 'מאפיינים: [ (שם, ערך) ]' עיצוב 'מקונן', אחרת היבטים ייתנו התאמות שגויות.
3) רלוונטיות: BM25, דחיפה והיברידי
3. 1 קלאסיקות (BM25)
צרף שדות עם משקולות (כותרת ı4, תגיות _ 2, תיאור).
השתמש ”מינימום _ צריך _ להתאים” כדי לשלוט בגפרורים רועשים.
3. 2 וקטורים (kNN) + BM25 (rerk)
שיבוץ (למשל: 384-768) ב- ”dosse _ vector”.
תחילה kNN על ידי וקטור (200-500), ולאחר מכן rescore BM25 + business hosts (חידוש, RTP, רישיון אזור).
json
{
"knn": {
"field": "embedding",
"query_vector": [/... /],
"k": 400, "num_candidates": 2000
},
"query": {
"bool": {
"should": [
{ "multi_match": {
"query": "египетские слоты джекпот",
"fields": ["title^4","tags^2","description"],
"type": "best_fields",
"minimum_should_match": "60%"
}}
],
"filter": [
{ "term": { "region": "TR" }},
{ "range": { "rtp": { "gte": 94.0 }}}
]
}
},
"rescore": {
"window_size": 400,
"query": {
"rescore_query": {
"function_score": {
"query": { "match_all": {} },
"boost_mode": "sum",
"functions": [
{ "gauss": { "released_at": { "scale": "180d", "offset": "30d", "decay": 0.5 } } },
{ "field_value_factor": { "field": "popularity", "factor": 0.2, "modifier": "log1p" } }
]
}
}
}
},
"highlight": { "fields": { "title": {}, "description": {} } }
}
4) השלמה אוטומטית והערות
גישות:- אדג 'N-גרם על כותרת התת-שדה. nam '(מהיר, פשוט).
- Supertion swesters (”שדה השלמה”) - רמזים מהירים, אבל נתיב אינדקס נפרד.
- חיפוש-כפי-you-type-משלב אסימונים להתחלת מילים וביטויים.
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}
5) מילים נרדפות, שגיאות דפוס ורב ־ לשוניות
מילים נרדפות: טען את הקובץ/רשימה דרך מסנן ה ”מילה נרדפת”; תחומים נפרדים (קזינו/ספורט).
Typos: ”ערפול: AUTO 'in' multi _ game”, הגבלת אורך ושדות. למצב השלמה ”מעורפל”.
- Index-per-locale (ru/en/tr/pt-BR) או multi-analizer circle: ”כותרת _ ru”, ”כותרת _ en”.
- מנתחים רבים: ”רוסי”, ”אנגלי”, ”טורקי”, ”פורטוגזי”.
- העבר את השפה למפתח הניתוב כדי לשמור על המקומות החמים קרובים יותר למשתמש.
6) מסננים, היבטים וצבירים
עבור היבטים, השתמש ”מילת מפתח” ו ”מקונן” צבירה.
הימנעו משדות חשמנים (תעודות זהות ייחודיות) בצבירה - הביאו אותם לשדות או לחלונות מראש.
json
{
"size": 20,
"aggs": {
"by_provider": { "terms": { "field": "provider", "size": 20 } },
"by_volatility": { "terms": { "field": "volatility" } },
"rtp_hist": { "histogram": { "field": "rtp", "interval": 1 } }
}
}
7) כניסת נתונים וסליקת טקסט
צינורות בולטים: נורמליזציה, חילוץ שדה, קידוד גיאו, מחיקת HTML.
מצורף/innegut-ocr (לפי הצורך): PDF/image indexing (זהירות עם PII).
למטיזציה: באמצעות מנתחים או צינורות חיצוניים (אסימונים נקודתיים).
8) רסיסים, העתקים ו ־ ILM
8. ממדים 1 ושרדינג
פחות רסיסים טובים יותר. 10-50GB לשבר לעומסים מעורבים.
התחל עם ”מספר _ של _ shards: 1-3”, קנה מידה למעשה. העתקים - לפחות 1 במכירות.
8. 2 ILM (אופן חיים)
# מחיקה חמה של קור מחק עבור יומנים/פרומו היסטוריה.
מיזוג כוח עבור קטעים קרים.
לקטלוגים וחיפוש מוצר - ”נצחי” חם עם אופטימיזציה מחזורית.
8. 3 אלגוריתם נדידה ללא זמן
האינדקס החדש 'games _ v2' iaas 'games' מתגים אחרי 'reindex' ו-backfill. שדות מדוכאים - להסיר בהדרגה.
9) תמונות, ד "ר ועדכונים
תמונות לאחסון אובייקטים (S3/GCS), לוח זמנים ובדיקה מחודשת.
עדכונים של צמתים, בדיקת מודעות הקצאת רסיס (על ידי אזורים).
ד "ר תוכניות: שכפול חוצה-אזור (CCR) לאינדקסים קריטיים (ספריות, ספריות).
10) בטיחות ומח "ש
TLS/mTLS בין לקוח לאשכול.
RBAC: תפקידים לאינדקס/פעולה; Dev/Stage/Prod - בנפרד.
PII/PCI: אל תפתח שדות עם נתונים אישיים שלא לצורך; השתמש במסווה בלע.
זכות להישכח: לשמור קישורים למסמכים למחיקה על ידי user_id; רך למחוק + רינדקס/הודעה.
11) יכולת תצפית וחיפוש SLO
מדדים:- P50/P95/P99 איחור לשאילתה, 4xx/5xx שגיאות.
- להיט מטמון (מטמון שאילתות/מטמון בקשה).
- שימוש בערימה, GC, מיזוג קטעים, שלוליות (חיפוש/כתיבה).
- רסיסים חמים/צמתים חמים, דחיות.
- KnN: "graph _ hits'," search _ k ", latency, recall @ k.
- חיפוש אחר משחקים: P95 200 ms, שגיאות <0. 5% בחלון 30 דקות.
- טיפים: P95 חסום 80 ms.
- P95 350ms עבור למעלה-20 תוצאות.
12) FinOps: עלות וביצועים
גודל אינדקס: שמור אסימונים, בטל ”fielddata” מיותר, השתמש ב ”doc _ values” רק במקרה הצורך.
מגזרים: מדיניות מיזוג תכנית, לא לאפשר ”פיצול”.
KNN יקר יותר ב RAM/CPU: הגבלת עממים, 'num _ מועמדים', קדם-מסנן על BM25.
שדות חמים ב-RAM: מנטר נתוני שדה/ערימה; קח אגרגציות ”כבדות” למדדים נפרדים.
13) בקשות מדגם
13. 1 טקסט מלא שדה רב עם דחיפה
json
{
"query": {
"multi_match": {
"query": "book of",
"fields": ["title^4","title.ngram^2","tags^2","description"]
}
},
"sort": ["_score", { "released_at": "desc" }]
}
13. 2 מסננים + היבטים
json
{
"query": {
"bool": {
"must": [{ "match": { "title": "египет" }}],
"filter": [
{ "terms": { "provider": ["Novomatic","PragmaticPlay"]}},
{ "range": { "rtp": { "gte": 95 }}}
]
}
},
"aggs": {
"by_provider": { "terms": { "field": "provider" } },
"by_year": { "date_histogram": { "field": "released_at", "calendar_interval": "year" } }
}
}
13. 3 סינון תכונות מקונן
json
{
"query": {
"nested": {
"path": "features",
"query": { "bool": {
"must": [
{ "term": { "features.name": "volatility" }},
{ "term": { "features.value": "high" }}
]
}}
}
}
}
13. 4 חיפוש יומן (ECS) עם גולת הכותרת
json
{
"query": {
"bool": {
"must": [{ "match_phrase": { "message": "payment declined" }}],
"filter": [
{ "term": { "service.name": "payments" }},
{ "range": { "@timestamp": { "gte": "now-1h" }}}
]
}
},
"highlight": { "fields": { "message": { "number_of_fragments": 0 } } }
}
14) רב ־ דייר ובידוד
אינדקס לדייר (טוב יותר) או field 'terant _ id' + ACL filter (יקר יותר על אגרגציות).
ניתוב על ידי 'דייר _ id' כדי לאתר רסיסים.
הגבל את בקשות הדייר להגבלות/פסקי זמן, שאילתה. שלב "מעקות שמירה.
15) רשימת מימושים
1. סכימה: ”טקסט/מילת מפתח/מקונן” + רב-שדות, ”צפוף _ וקטור” במידת הצורך.
2. אנליזרים לשפה, מילים נרדפות, אדג-נגרם להשלמה אוטומטית.
3. רלוונטי: BM25 מגביר + kNN = rescore היברידי.
4. היבטים: מילת מפתח/מקונן, צבירה רק לשדות ”בריאים”.
5. אינדקס: בלע צינורות (נורמליזציה), טעינה אצווה.
6. התחל קטן, כינוי למעבר, ILM ליומנים ”ארוכים”.
7. ד "ר: לוח הזמנים של התמונות, בדיקת התאוששות, CCR לאינדקסים קריטיים.
8. אבטחה: TLS, RBAC, מסווה PII, מדיניות מחיקה.
9. יכולת תצפית: Latency, ערימה/GC, להיט מטמון, שברים חמים, דחיות.
10. FinOps: גודל אינדקס, פרמטריזציה של kNN, ביטול תוספת 'doc _ values/fielddata'.
16) אנטי דפוסים
אינדקס אחד ”לכל”: תחומים שונים (ספרייה, יומנים, עסקאות) דורשים הגדרות שונות.
חוסר התחשבות: אוטומטי. לאט וברעשן בכל התחומים.
מילים נרדפות ”לאכול את המשמעות”: לא להפריד בין תחומי מילון.
ללא קינון שבו חבילות שדה = היבטים כוזבים נחוצים.
יותר מדי רסיסים (אחד לכל מסמך) - תקורה במצב אשכול.
אי שימוש בשם בדוי במהלך נדידה - השבתה וחוליות שבורות.
אינדקס PII ”כפי שהוא” - סיכונים רגולטוריים ואינדקסים יקרים.
17) הקשר iGaming/fintech: מתכונים מהירים
חיפוש אחר משחקים: ”multi _ batch” עם הדחיפה ”thar”, ”tages ı2”, היבטים של הספק/תנודתיות, מסננים על ידי אזור/מטבע, היברידי עם וקטורים עבור ”נושאים” (לדוגמה, ”Egypt”, ”fruit classic”).
פרומו/בונוסים: מילים נרדפות ("freespins", "free spins'), מסנני נתונים" active _ from/active _ to ", טיפים באמצעות השלמה.
יומני KYC/AML: סכימת ECS, טקסט מלא על ידי ”הודעה”, צבירה על ידי ”כלל _ שם”, ”מדינה”, חריגות על ידי ”@ timestamp” היסטוגרמה.
ספריית ספק: שדות מילות מפתח עבור היבטים ומינים; תיאורי טקסט - 'טקסט' עם מורפולוגיה.
דפי רגולציה: שדות רב-לשוניים, ”search _ as _ you _ type” עבור רמזים רכים.
תוצאות
חיפוש יעיל על Elasticsearch אינו רק "מדליק את BM25": אלה הם המנתחים הנכונים והמפות, שדות מרובים ומקוננים, הכלאה של BM25 + וקטורים, היבטים מסודרים וצבירים, משמעת של חדירה ו-ILM, סלו "ם ברורים ויכולת תצפית, כמו גם בטיחות ו-FinOps עם עקרונות אלה, החיפוש שלך יהיה מהיר, רלוונטי וצפוי - ויעמוד בשיאים בתעבורת פלטפורמת מוצר.