Τεχνολογία και υποδομή - Έρευνα ελαστικού και αναζήτηση πλήρους κειμένου
Αναζήτηση ελαστικών και αναζήτηση πλήρους κειμένου
1) Ρόλος της ελαστικοποίησης
Το Elasticsearch (ES) είναι ένα κατανεμημένο σύστημα αναζήτησης και ανάλυσης βασισμένο σε ανεστραμμένους δείκτες και δομές στηλών για συγκεντρώσεις. Δίνει:- Πλήρες κείμενο: συνάφεια (BM25), μορφολογία, ασαφές/τυπογραφικό ανεκτικό.
- Όψεις και ομαδοποιήσεις: γρήγορες φέτες ανά ιδιότητα.
- Υβριδική αναζήτηση: BM25 + διάνυσμα kNN (σημασιολογία).
- Ταχύτητα ανάπτυξης: Ερωτηματολόγιο DSL, αγωγοί κατάποσης, πλούσιο οικοσύστημα.
Για το iGaming/fintech: αναζήτηση παιχνιδιών/παρόχων, promos και κανόνων, ταχείας αντίδρασης πτυχές (πάροχος, μεταβλητότητα, RTP, γλώσσα), αναζήτηση περιοδικών KYC/AML, καταγραφές ανάλυσης και ειδοποιήσεις.
2) Υπόδειγμα δεδομένων και χαρτογραφήσεις
2. 1 Δείκτης πεδίου και τύποι
'text' for πλήρες κείμενο.
«λέξη κλειδί» - ακριβείς τιμές/συγκεντρώσεις/ταξινόμηση.
'date', 'long/double', 'boolean', 'ip', 'geo _ point'.
'nested' - συστοιχίες αντικειμένων με σωστή συσχέτιση πεδίου.
'dense _ vector' - διανυσματικές αναπαραστάσεις (ενσωματώσεις).
2. 2 Στρατηγική πολλαπλών πεδίων
Αποθηκεύστε το πεδίο σε διάφορες απόψεις: 'ονοματεπώνυμο. κείμενο «,» όνομα. raw '(λέξη κλειδί),' name. ngram '(για αυτόματη συμπλήρωση).
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, περιγραφή).
Χρήση 'minimum _ shame' για τον έλεγχο θορυβωδών αγώνων.
3. 2 Διανύσματα (kNN) + BM25 (κατάταξη)
Ενσωματώσεις (π.χ. 384-768) σε 'πυκνό _ διάνυσμα'.
Πρώτα kNN ανά φορέα (top 200-500), στη συνέχεια rescore BM25 + επιχειρηματική ενίσχυση (καινοτομία, 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-gram στον τίτλο υποπεδίου. ngram '(γρήγορα, απλά).
- Υποδείξεις ολοκλήρωσης (πεδίο 'ολοκλήρωσης') - γρήγορες υποδείξεις, αλλά ξεχωριστή διαδρομή ευρετηρίασης.
- Το Search-as-you-type συνδυάζει τη σήμανση για να ξεκινήσει λέξεις και φράσεις.
json
{ "suggest": { "game-suggest": { "prefix": "book o", "completion": { "field": "title_suggest", "fuzzy": { "fuzziness": 1 }}}}}
5) Συνώνυμα, τυπογραφικά λάθη και πολυγλωσσία
Συνώνυμα: φορτώστε το αρχείο/τη λίστα μέσω του φίλτρου «συνώνυμο». ξεχωριστοί τομείς (καζίνο/αθλητισμός).
Τύπος: 'fuzziness: AUTO' in 'multi _ match', limit to length and fields. Για κίνητρα - «ασαφής» τρόπος ολοκλήρωσης.
- Index-per-locale (ru/en/tr/pt-BR) ή κύκλωμα πολλαπλών αναλύσεων: 'title _ ru', 'title _ en'.
- αναλυτές: «ρωσικά», «αγγλικά», «τουρκικά», «πορτογαλικά».
- Μετακινήστε τη γλώσσα στο κλειδί δρομολόγησης για να κρατήσετε τις καυτές τοποθεσίες πιο κοντά στο χρήστη.
6) Φίλτρα, πτυχές και ομαδοποιήσεις
Για τις πτυχές, χρησιμοποιήστε τη λέξη «κλειδί» και τη λέξη «ένθετο».
Αποφύγετε τα κεντρικά πεδία (μοναδικές ταυτότητες) σε συγκεντρώσεις - φέρτε τα σε πεδία 'runtime' ή προ-παράθυρα.
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.
Προσάρτηση/κατάποση-ocr (όπως απαιτείται): PDF/ευρετηρίαση εικόνας (προσεκτική με PII).
Lemmatization: μέσω αναλυτών ή εξωτερικών αγωγών (precompute mockens).
8) Θραύσματα, αντίγραφα και ILM
8. 1 Διαστάσεις και βραχίονας
Λιγότερα θραύσματα είναι καλύτερα. Στόχος: 10-50GB ανά θραύσμα για μικτά φορτία.
Ξεκινήστε με 'number _ of _ shards: 1-3', κλίμακα στην πραγματικότητα. Αντίγραφα - τουλάχιστον 1 στις πωλήσεις.
8. 2 ILM (Κύκλος ζωής)
ζεστό → ζεστό → κρύο → διαγραφή για κούτσουρο/promo ιστορικού.
Συγχώνευση δύναμης για ψυχρά τμήματα.
Για καταλόγους και αναζήτηση προϊόντων - «αέναη» θερμή με περιοδική βελτιστοποίηση.
8. 3 Αλγόριθμος μετάβασης χωρίς καθυστέρηση
Ο νέος δείκτης 'παιχνίδια _ v2' → ψευδώνυμο 'παιχνίδια' αλλάζει μετά το 'rendex' και το backfill. Καταθλιπτικά πεδία - σταδιακή αφαίρεση.
9) Στιγμιότυπα, DR και ενημερώσεις
Στιγμιότυπα για αποθήκευση αντικειμένων (S3/GCS), προγραμματισμός και αποκατάσταση ελέγχου.
Επικαιροποιήσεις κυλιόμενων κόμβων, έλεγχος της ευαισθητοποίησης σχετικά με την κατανομή θραυσμάτων (ανά ζώνη).
Σχέδια DR: διαπεριφερειακή αντιγραφή (CCR) για κρίσιμους δείκτες (καταλόγους, καταλόγους).
10) Ασφάλεια και PII
TLS/mTLS μεταξύ πελάτη και συμπλέγματος.
RBAC: ρόλοι ανά δείκτη/λειτουργία· Dev/Stage/Prod - χωριστά.
PII/ΕΚΕ: να μην καταγράφονται άσκοπα πεδία με προσωπικά δεδομένα· Χρησιμοποιήστε την απόκρυψη.
Δικαίωμα να λησμονείται: διατήρηση δεσμών με έγγραφα προς διαγραφή με user_id· soft-delete + rendex/ανακοίνωση.
11) Παρατηρησιμότητα και SLO αναζήτησης
Μετρήσεις:- καθυστέρηση στο ερώτημα, 4xx/5xx λάθη.
- Cache hit (cache/shard request cache).
- Χρήση σωρού, GC паузы, συγχωνεύσεις τμήματος, πούλμαν (αναζήτηση/εγγραφή).
- Θραύσματα/θερμοί κόμβοι, απορρίψεις.
- KNN: 'graph _ hits', 'search _ k', latency, remall @ k.
- Αναζήτηση παιχνιδιών: P95 ≤ 200 ms, σφάλματα <0. 5% στο παράθυρο των 30 λεπτών.
- Συμβουλές: P95 ≤ 80 ms.
- Υβριδικό KNN: P95 ≤ 350ms για top-20 αποτελέσματα.
12) FinOps: κόστος και απόδοση
Μέγεθος δείκτη: αποθήκευση μαρκινοποίησης, απενεργοποίηση περιττών 'fielddata', χρήση 'doc _ value' μόνο όπου είναι απαραίτητο.
Τμήματα: Συγχώνευση του σχεδίου πολιτικής, μη επιτρέπετε «διαχωρισμό».
KNN είναι πιο ακριβό σε RAM/CPU: όριο dims, '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. Φωλιασμένο φιλτράρισμα χαρακτηριστικών
json
{
"query": {
"nested": {
"path": "features",
"query": { "bool": {
"must": [
{ "term": { "features.name": "volatility" }},
{ "term": { "features.value": "high" }}
]
}}
}
}
}
13. 4 Αναζήτηση καταγραφής (ECS) με το Highlight
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) Πολυπληθής και απομόνωση
Δείκτης για τον ενοικιαστή (καλύτερο) ή το φίλτρο «ενοικιαστής _ id» + ACL (πιο ακριβό για τις συγκεντρώσεις).
Δρομολόγηση από τον 'ενοικιαστή _ id' για εντοπισμό θραυσμάτων.
Περιορισμός των αιτήσεων των ενοικιαστών σε όρια/χρονοδιαγράμματα, "ερώτηση. ράγες φρουράς φάσης.
15) Κατάλογος ελέγχου εφαρμογής
1. Σχήμα: 'text/keyword/nested' + multi-fields, 'dense _ vector' αν είναι απαραίτητο.
2. Αναλυτές ανά γλώσσα, συνώνυμα, άκρο-ngram για αυτόματη ολοκλήρωση.
3. Συνάφεια: BM25 ενισχύει + υβριδικά kNN→rescore.
4. Όψη: λέξη-κλειδί/ένθετη, συγκέντρωση μόνο για «υγιή» πεδία.
5. Ευρετηρίαση: τροφοδοτούμενοι αγωγοί (κανονικοποίηση), φόρτωση παρτίδων.
6. Sharding: έναρξη μικρών, ψευδώνυμων για μετακίνηση, ILM για «μακριούς» κορμούς.
7. Χρονοδιάγραμμα στιγμιότυπων, έλεγχος ανάκτησης, CCR για κρίσιμους δείκτες.
8. Ασφάλεια: TLS, RBAC, συγκάλυψη PII, πολιτική διαγραφής.
9. Παρατηρησιμότητα: καθυστέρηση, σωρός/GC, κρύπτη, θραύσματα, απορρίψεις.
10. FinOps: μέγεθος δείκτη, παραμετροποίηση kNN, απενεργοποίηση επιπλέον 'doc _ value/fieldata'.
16) Αντι-μοτίβα
Ένας δείκτης «για όλους»: διαφορετικοί τομείς (κατάλογος, αρχεία καταγραφής, συναλλαγές) απαιτούν διαφορετικές ρυθμίσεις.
Η απερίσκεπτη «ασάφεια: AUTO» → αργά και θορυβωδώς σε όλους τους τομείς.
Συνώνυμα «feat up meaning»: μην διαχωρίζετε τους τομείς του λεξικού.
Χωρίς ένθετο, όπου απαιτούνται δέσμες πεδίων → ψευδείς πτυχές.
Πάρα πολλά θραύσματα (ένα ανά έγγραφο) - από πάνω.
Μη χρήση ψευδώνυμου κατά τη διάρκεια των μεταναστεύσεων - χρόνος διακοπής και σπασμένοι δεσμοί.
Τιμαριθμική αναπροσαρμογή PII «όπως είναι» - ρυθμιστικοί κίνδυνοι και δαπανηρές ταράνδες.
17) Πλαίσιο iGaming/fintech: Γρήγορες συνταγές
Αναζήτηση παιχνιδιών: 'multi _ match' με την ώθηση 'τίτλος 4', 'tags 2', όψεις ανά πάροχο/μεταβλητότητα, φίλτρα ανά περιοχή/νόμισμα, υβριδικά με διανύσματα για «θέματα» (για παράδειγμα, «Αίγυπτος», «κλασικό φρούτο»).
Promo/bonus: συνώνυμα ("freespi ," free spins "), φίλτρα δεδομένων ενεργά _ από/σε ', συμβουλές μέχρι την ολοκλήρωσή τους.
Καταγραφές KYC/AML: σχήμα ECS, πλήρες κείμενο με 'μήνυμα', συγκεντρώσεις με 'κανόνα _ όνομα', 'χώρα', ανωμαλίες από '@ timestamp' histogram.
Κατάλογος παρόχων: πεδία λέξεων-κλειδιών για πτυχές και είδη. περιγραφές κειμένου - «κείμενο» με μορφολογία.
Κανονιστικές σελίδες: πολύγλωσσα πεδία, 'search _ as _ you _ type' για μαλακές υποδείξεις.
Αποτέλεσμα
Η αποτελεσματική αναζήτηση σε Elasticsearch δεν είναι μόνο «ενεργοποιήστε το BM25»: αυτοί είναι οι σωστοί αναλυτές και χαρτογραφήσεις, πολυπλοκότητες και ένθετοι, ένα υβρίδιο από BM25 + φορείς, τακτοποιημένες πτυχές και συγκεντρώσεις, η πειθαρχία του sharding και ILM, σαφείς SLO και παρατηρησιμότητα, καθώς και ασφάλεια και FinOps. Με αυτές τις αρχές, η αναζήτησή σας θα είναι γρήγορη, σχετική και προβλέψιμη - και θα αντέχει σε κορυφές στην κυκλοφορία των πλατφορμών προϊόντων.