Φιλτράρισμα και αναζήτηση πλήρους κειμένου
1) Γιατί χρειάζεστε ένα στρώμα αναζήτησης
Το φιλτράρισμα και η αναζήτηση πλήρους κειμένου (full-text search - FTS) παρέχουν γρήγορη πρόσβαση στα δεδομένα «κατά νόημα», όχι μόνο από τα βασικά κλειδιά. Ένα κατάλληλα σχεδιασμένο στρώμα αναζήτησης συνδυάζει:- Αυστηρά φίλτρα (κατηγορίες, ημερομηνίες, τιμές, δικαιώματα πρόσβασης)
- Πλήρες κείμενο (λεξικό ταίριασμα και κατάταξη)
- Πτυχές (συγκεντρωτικά μεγέθη για τη ναυσιπλοΐα)
- Υβριδική κατάταξη (BM25/TF-IDF + Ενσωμάτωση φορέων)
- Αξιόπιστα πρωτόκολλα (σελιδοποίηση δρομέα, συμβολική TTL, διασταύρωση)
2) Αρχιτεκτονική εικόνα
Κατασκευαστικά στοιχεία:1. Κατάποση/ETL → ομαλοποίηση, αποπάγωση, εμπλουτισμός, οικοδομικά πεδία για τον δείκτη.
2. Δείκτης → αντίστροφος δείκτης (σημεία → έγγραφα), δομές στήλης, διανυσματικός δείκτης (HNSW/IVF-PQ).
3. Το επίπεδο ερωτήσεων → ζητά parser, εφαρμογή φίλτρων/δικαιωμάτων πρόσβασης, προγραμματιστής κομματιών, συγχώνευση k-way.
4. Ranker → BM25 + LTR/Neural re-rank.
5. Σερβίροντας → κρύπτη, δρομείς, όψεις, ανταύγειες, αυτόματη συμπλήρωση.
6. Παρατηρησιμότητα → καθυστέρηση, μετρήσεις ποιότητας, πειράματα A/B.
3) Υποδείγματα δεδομένων και δεικτών
3. 1 Πεδία και αναλυτές
Τύποι: λέξη-κλειδί (ακόμη και ταίριασμα), κείμενο (αναλυμένο), αριθμητικό/ημερομηνία/γεω, διάνυσμα.
Αναλυτές: μαρκινοποίηση, ομαλοποίηση (κάτω περίπτωση, Unicode NFKC), φίλτρα (stopwords, stemming/lemmatization).
Πολυγλωσσία: αναλυτές ανά πεδίο (ru, uk, en) ανάλυση ICU· μεταγραμματισμός· εξέταση των διακριτικών.
3. 2 Αντίστροφος δείκτης (αραιός)
Δομή: κατάλογος όρων απόσπασης (docID, όρος freq, θέσεις).
Κατάταξη: BM25 (ή κλασικό TF-IDF) με ενίσχυση πεδίου.
3. 3 Διανυσματικός δείκτης (πυκνός)
Ενσωματώσεις κειμένου (π.χ. 384-1024-διαστάσεων).
Δομές ANN: HNSW, IVF-PQ, επίπεδο (για μικρά σύνολα).
εγγύτητα συνημίτονου/εσωτερικό προϊόν· βαθμονόμηση (υβριδική).
3. 4 Πτυχές και συγκεντρωτικά μεγέθη
Precompute/στήλη αποθήκευση τιμών για γρήγορους αριθμούς.
Ιεραρχικές πτυχές (κατηγορία/υποκατηγορία).
Εύρος τιμών (κάδοι τιμών, ημερομηνίες).
4) Ερωτήματα: φίλτρα + πλήρες κείμενο + ταξινόμηση
4. 1 Συμβάσεις API (REST)
Αίτηση:
GET /v1/search? q = classic slots & limit = 20 & cursor =... & sort = score: desc, created _ at: desc
&filters=brand:("NetEnt","EGT"); price:[10 TO 50];published_at:[2024-01-01 TO ]
&facets=brand,year,price:range(0,10,20,50,100)
Απόκριση (θραύσμα):
json
{
"items": [ { "id":"...", "title":"...", "score": 12. 3, "highlight": { "content": ["..."] } } ],
"facets": { "brand": [{"value":"NetEnt","count":123},...] },
"page": { "limit":20, "has_more":true, "next_cursor":"opaque-token" }
}
4. 2 GraphQL (απλουστευμένο)
graphql type Query {
search(query: String!, filter: SearchFilter, first: Int, after: String, sort: [Sort!]): SearchConnection!
}
4. 3 gRPC
proto message SearchRequest {
string query = 1;
map<string,string> filters = 2;
int32 page_size = 3;
string page_token = 4; // курсор repeated string facets = 5;
}
5) Επεξεργασία φυσικής γλώσσας (NLP)
Τοκενοποίηση/κανονικοποίηση: Unicode-safe, παύλα/απόστροφος λογιστική.
Stopwords: λίστα προσαρμογής ανά γλώσσα.
Stemming vs lemmatization: για το ru/uk lemmatization είναι καλύτερη (ποιότητα> ταχύτητα).
Συνώνυμα: δικατευθυντικά/κατευθυνόμενα λεξικά. εκδόσεις λεξικού με TTL.
Τύπος (ασαφής): Damerau-Levenshtein με περιορισμό απόστασης και ακριβή ενίσχυση αγώνα.
N-γραμμάρια/ngram ακμής: για αυτόματη συμπλήρωση και υποδείξεις.
Μεταγραφή: «shch» ↔ «u», «kyiv/kyiv» - κανόνες αλληλογραφίας.
6) Καταλληλότητα και κατάταξη
6. 1 Βασική λεξική βαθμολόγηση
με το 'k1', 'b' ρύθμιση με συλλογή.
Ενισχύει τα πεδία (τίτλος 3, ετικέτες 1. 5, σώμα 1).
Φρεσκάδα: 'score + = freshness_boost (διάσπαση (created_at))'.
6. Συμπεριφορικές ατάκες
Click-through ρυθμό, χρόνος παραμονής, αποθήκευση σε αγαπημένα (με αντι-θέση bayas).
Αφαίρεση - Στιλβώστε μαζί έγγραφα με ~ πανομοιότυπο περιεχόμενο (MinHash/SimHash).
6. 3 Μάθηση προς κατάταξη (LTR)
Χαρακτηριστικά: πεδίο BM25, μήκος, φρεσκάδα, δημοτικότητα, ταίριασμα με φράση, ταχύτητα θέσης.
Μοντέλα: LambdaMART/XGBoost; offline metrics NDCG @ k, MAP, Precision @ k; Online A/B.
6. 4 Νευρο-αναδιάταξη
Δύο στάδια: ανάκληση (BM25/ANN) → top-N (για παράδειγμα, 200) → cross-encoder rank.
Λογιστική κόστους: προϋπολογισμός χρόνου, επιστροφή χωρίς νευρο-στάδιο υπό φόρτιση.
6. 5 Υβριδική αναζήτηση (αραιή + πυκνή)
Είτε σύντηξη (κανονικοποίηση των ταχυτήτων και του αθροίσματος), ή πολλαπλών σταδίων (πυκνή ως rerank).
Η βαθμονόμηση είναι σημαντική: min-max/z-score/ποσοτική χαρτογράφηση.
7) Φιλτράρισμα, πτυχές και πρόσβαση
7. 1 Φίλτρα
Χειριστές: '=', 'IN', σειρές, προθέματα, γεω-δεσμευμένο πλαίσιο/γεωγραφική απόσταση.
Συνδυασμοί: 'AND' από φίλτρα, 'OR' μέσα σε ένα σύνολο τιμών (brand IN...).
Ασφάλεια τύπου: τα αριθμητικά πεδία δεν αναλύονται ως κείμενο.
7. 2 πτυχές
Φτηνές μετρήσεις για προ-υπολογισμένες δομές.
Οι πτυχές «εφαρμοσμένες» δείχνουν τις υπόλοιπες πτυχές μετά το φίλτρο.
7. 3 Πρόσβαση/πολυκατοικία
Τα φίλτρα ασφαλείας ενσωματώνονται πριν από την κατάταξη (προ-φίλτρο).
πεδία ABAC/RBAC στο έγγραφο («ενοικιαστής _ id», «ορατότητα», «acl»).
Το σήμα αίτησης υπογράφεται. με πολυκατοικία - αυτόματο 'tenant _ i filter.
8) Σελιδοποίηση, δρομείς και συνέπεια
Pagination by seek-cursor by '(score, tie-breaker)' or by '(created_at, id)' when sorted by time.
Αδιαφανές 'page _ token' με HMAC και TTL.
Συνοχή: δείκτης σχεδόν πραγματικού χρόνου (NRT): καθυστέρηση 0. 5-2 s μεταξύ καταγραφής και ορατότητας. Έγγραφο στο SLA.
Cross-shard: η τοπική αναζήτηση → k-way συγχωνεύεται με την παγκόσμια τάξη, per-shard δρομείς στο συμβολικό.
9) AutoComplete και κίνητρα
Προτείνοντες: πρόθεμα-τρίο/άκρο-ngrams по полю 'τίτλος'.
Δημοφιλή ερωτήματα: καταγραφή κλικ → συμβουλές για δημοτικότητα + εξατομίκευση (τμήματα).
Spell-as-you-type: γρήγορη ασαφής αναζήτηση με όριο απόστασης '<= 1'.
ΠΑΡΑΔΕΙΓΜΑ ΞΕΚΟΥΡΑΣΗΣ
GET /v1/suggest? q=kaz&limit=8&locale=ru
→ ["casino," "casual games,..."]
10) Κύρια σημεία και αποσπάσματα
Δείκτης θέσης → ανάκτηση φράσεων με σπίρτα.
Διαφυγή HTML, όριο μήκους, ένωση γειτονικών τμημάτων.
Κατάταξη snippets κατά πυκνότητα των σχετικών όρων.
11) Επιδόσεις, κρύπτη και SLO
Δείκτες: θερμά τμήματα στη μνήμη. αναρτήσεις συμπίεσης· τιμές doc για τις πτυχές.
Μνήμη: L1 (διαδικασία), L2 (Redis), όψεις/συγκεντρωτικά μεγέθη. απενεργοποιημένα ανά έκδοση δείκτη.
SLO: P95 <150-200 ms σε «k <= 20», P99 <500 ms· διαθεσιμότητα 99. 9%.
Backpressure: μείωση 'k', απενεργοποίηση του νευρο-σταδίου όταν υπερφορτώνεται.
Ποσοστό που περιορίζεται στο πλήκτρο API/χρήστη/ενοικιαστή.
12) Παρατηρησιμότητα και μετρήσεις ποιότητας
Τεχνικές μετρήσεις:- 'search _ latency _ m (P50/P95/P99),' qp , 'timeout ,' error _ rate '
- 'cache _ hit _ ratio', 'facet _ cache _ hit', 'rank _ share'
- 'shard _ fanout', 'merge _ time _ m ,' ann _ recall @ k '
- NDCG @ k, MAP, MRR, Rember @ k, Precision @ k σε σημειωμένα δείγματα.
- CTR @ k, sCTR (ικανοποιημένα κλικ), χρόνος παραμονής, отказ (pogostick rate).
A/B: καθορισμός μετρήσεων «guardrail» (καθυστέρηση, σφάλματα) + στόχος (διαμεσολαβητής NDCG).
13) Δοκιμές
Δοκιμές μονάδας καταλληλότητας: έλεγχος αναμενόμενων αγώνων για βασικές αιτήσεις.
Με βάση την ιδιοκτησία: αντίσταση στα τυπογραφήματα/συνώνυμα/γλώσσες.
Σελιδοδείκτης: δεν υπάρχουν αντίγραφα στο όριο της σελίδας (αναζήτηση συμβάσεων).
Ασφάλεια: τα φίλτρα πρόσβασης εφαρμόζονται πάντοτε (ακόμη και σε περίπτωση καταμέτρησης).
Αναπαραστάσεις λεξικού: συνώνυμα έκδοσης και ασαφείς κανόνες.
14) Ασφάλεια και ιδιωτικότητα
Τα πεδία με PII δεν είναι δεικτοποιημένα ως κείμενο. αποθηκεύει χωριστά/κρυπτογραφεί.
Ελαχιστοποίηση αποθηκευμένων πηγών (αποθήκευση = ψευδή, snippet πεδία μόνο).
Προστασία της ιδιωτικής ζωής: μη καταχωρήσετε ανεπεξέργαστα αιτήματα με PII. ανωνυμοποίηση/hashing.
Πολυπληθής: αυστηρή απομόνωση δείκτη ή υποχρεωτική 'tenant _ i filter.
15) Μετανάστευση και διαλειτουργικότητα
Σύστημα δεικτών έκδοσης (v1→v2) με διπλή εγγραφή και σταδιακό διακόπτη.
Συμβατότητα του αναλυτή: μην επαναπροσδιορίσετε παλιές αλυσίδες ακόμα.
Περιστροφή των λεξικών συνώνυμο/λέξη στάσης: 'έκδοση', 'ενεργοποιημένη _ a , rollback.
16) Πρακτικές συνταγές
16. 1 Κλασική λεξική αναζήτηση (BM25)
Πεδία: 'τίτλος 3', 'ετικέτες 2', 'σώμα 1'.
Αναλυτές: ειδική γλώσσα + λεμματοποίηση.
Ασαφής για σύντομες ερωτήσεις ('<= 3' μάρκες), 'ασαφής = 1'.
16. 2 Υβριδικό αραιό + πυκνό
1. Αναζήτηση ANN με ενσωμάτωση ερωτημάτων (k = 200)
2. Συγχώνευση με top-200 BM25
3. Βαθμός βαθμονόμησης σύντηξης
4. Πάρτε top-N (N = 20), προαιρετικά - βαθμίδα cross-κωδικοποιητή με επαρκή προϋπολογισμό.
16. Διαμόρφωση καταλόγου 3
Σκληρό προ-φίλτρο ανά δικαίωμα/ενοικιαστή
Πτυχές μετά το φίλτρο (αριθμοί συμπεριλαμβανομένων των ενεργών φίλτρων)
Ταξινόμηση ανά συνάφεια ή επιχειρηματικό πεδίο (τιμή/καινοτομία)
17) Αιτήσεις δειγματοληψίας (ψευδο-DSL)
Φίλτρα και διαλογή:json
{
"query": "live casino,"
"filters": {
"country": ["EE","LV","LT"],
"license": ["MGA","UKGC"],
"launched_at": {"gte": "2023-01-01"}
},
"sort": ["_score:desc","launched_at:desc"],
"facets": ["country","license"],
"page": {"limit": 20, "cursor": "opaque"}
}
Geopoisk:
json
{
"query": "casino",
"geo": {"lat": 59. 437, "lon": 24. 753, "radius_km": 50}
}
Αυτόματη συμπλήρωση:
json
{ "prefix": "evo", "field": "brand_suggest", "limit": 8 }
18) UX μοτίβα
Ενεργά τσιπ φίλτρου + «επαναφορά όλων».
Κενά αποτελέσματα: εμφάνιση «δοκιμάστε»... (συνώνυμα, αφαίρεση φίλτρου).
Μηδενικές υποδείξεις: δημοφιλή ερωτήματα/κατηγορίες.
Σελιδοδείκτης (Περισσότερο κουμπί) και άπειρη κύλιση. σταθερό δείκτη εφαρμοζόμενων φίλτρων.
Ξεχωριστοί διακόπτες «λαμβάνουν υπόψη τυπογραφικά λάθη», «ακριβής αντιστοιχία της φράσης».
19) Συχνά σφάλματα και αντι-πρότυπα
Δεν υπάρχει διακόπτης ισοπαλίας κατά τη διαλογή → διπλών/άλματα.
Παράμετροι χωρίς να λαμβάνονται υπόψη τα ενεργά φίλτρα → «ψευδείς» μετρήσεις.
Εφαρμογή φίλτρων πρόσβασης μετά την κατάταξη.
Ανάμειξη διαφορετικών γλωσσών με έναν αναλυτή.
Όφσετ/ΟΡΙΑΚΟ βαθιάς σηματοδότησης αντί για δρομέα αναζήτησης.
Απεριόριστη ασαφής έκρηξη λόγω καθυστέρησης.
20) Κατάλογος ελέγχου εφαρμογής
1. Ορισμός των πεδίων και των τύπων τους, εκχώρηση ανά τόπο αναλυτών.
2. Σχεδιασμός του αντίστροφου δείκτη + (επιλογή.) διάνυσμα ANN.
3. Εφαρμόστε ένα parser ερωτήσεων και ασφαλή προ-φίλτρα.
4. Δημιουργία BM25 και επιτόπιων ενισχύσεων. επισυνάπτουν πτυχές.
5. Εισάγετε δρομείς (αδιαφανείς, HMAC, TTL) και k-way συγχωνεύονται με θραύσματα.
6. Προσθέστε αυτόματη συμπλήρωση, ανταύγειες, ασφαλή θωράκιση.
7. Μετρήσεις: καθυστέρηση, NDCG @ k, CTR; κρύπτη.
8. Πλαίσιο A/B για τον συντονισμό της συνάφειας.
9. Έγγραφο SLA: καθυστέρηση NRT, όρια «ορίου», εγγύηση συνέπειας.
10. Σχέδιο μετάβασης: εκδόσεις δεικτών, λεξικών και αναλυτών.
Ένα καλά σχεδιασμένο επίπεδο φιλτραρίσματος και αναζήτησης πλήρους κειμένου δεν είναι μόνο ένας γρήγορος δείκτης, αλλά και μια σαφής σύμβαση πρωτοκόλλου με δρομείς, ασφάλεια, προβλέψιμη UX, και μετρήσιμη συνάφεια. Αυτή η προσέγγιση κλιμακώνεται από χιλιάδες σε δισεκατομμύρια έγγραφα και υποστηρίζει τόσο την κλασική λεξική αναζήτηση όσο και τα σύγχρονα υβριδικά σενάρια με την κατάταξη του νευρικού δικτύου.