فیلتر کردن و جستجوی تمام متن
1) چرا شما نیاز به یک لایه جستجو دارید
فیلتر کردن و جستجوی متن کامل (FTS) دسترسی سریع به داده ها را «به معنای»، نه فقط با کلید های اصلی فراهم می کند. یک لایه جستجو که به درستی طراحی شده است ترکیبی از:- فیلترهای سخت (دسته بندی، تاریخ، قیمت، حقوق دسترسی)
- متن کامل (مطابقت لغوی و رتبه بندی)
- جنبه ها (مصالح برای ناوبری)
- رتبه بندی ترکیبی (BM25/TF-IDF + تعبیه بردار)
- پروتکل های قابل اعتماد (صفحه بندی مکان نما، توکن TTL، کراس شاردینگ)
2) تصویر معماری
قطعات:1. Ingest/ETL → عادی سازی، deduplication، غنی سازی، ساخت زمینه برای شاخص.
2. شاخص → شاخص معکوس (نشانه → اسناد)، ساختار ستون، شاخص بردار (HNSW/IVF-PQ).
3. Query Layer → درخواست تجزیه کننده، استفاده از فیلترها/حقوق دسترسی، زمانبندی شارد، ادغام k-way.
4. رانکر → BM25 + LTR/رتبه بندی مجدد عصبی.
5. خدمت → کش، نشانگر، جنبه، برجسته، تکمیل خودکار.
6. قابلیت مشاهده → تاخیر، معیارهای کیفیت، آزمایش A/B.
3) مدل داده و شاخص
3. 1 زمینه ها و تجزیه و تحلیل
انواع: کلمه کلیدی (حتی مطابقت)، متن (تجزیه و تحلیل)، عددی/تاریخ/جغرافیایی، بردار.
آنالایزر: نشانه گذاری، عادی سازی (حروف کوچک، NFKC یونیکد)، فیلتر (stopwords، stemming/lemmatization).
چند زبانه: تجزیه و تحلیل در هر زمینه (ru، uk، en) ؛ تجزیه و تحلیل ICU ؛ ترجمه ؛ Diacritics را در نظر بگیرید.
3. 2 شاخص معکوس (پراکنده)
ساختار: اصطلاح → لیست ارسال (docID، اصطلاح freq، موقعیت).
رتبه بندی: BM25 (یا کلاسیک TF-IDF) با افزایش میدان.
3. 3 شاخص بردار (متراکم)
جاسازی متن (به عنوان مثال، 384-1024 بعدی).
ساختارهای ANN: HNSW، IVF-PQ، تخت (برای مجموعه های کوچک).
نزدیکی کسینوس/محصول داخلی ؛ کالیبراسیون BM25 (ترکیبی).
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 گرم کامپیوتر
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)
نشانه گذاری/عادی سازی: حسابداری یونیکد امن، خط تیره/آپوستروف.
Stopwords: لیست سفارشی سازی توسط زبان.
Stemming در مقابل lemmatization: برای lemmatization ru/uk بهتر است (کیفیت> سرعت).
مترادف: فرهنگ لغت دو طرفه/جهت ؛ نسخه های دیکشنری با TTL.
Typos (فازی): Damerau-Levenshtein با محدودیت فاصله و افزایش مسابقه دقیق.
N-grams/edge-ngrams: برای تکمیل خودکار و نکات.
Transliteration: «shch» ↔ «u»، «کیف/کیف» - قوانین مکاتبات.
6) ارتباط و رتبه بندی
6. 1 امتیاز دهی لغوی اساسی
با تنظیم «k1»، «b» توسط مجموعه BM25 کنید.
افزایش توسط زمینه ها (عنوان ^ 3، برچسب ها ^ 1. 5، بدن ^ 1).
تازگی: 'امتیاز + = freshness_boost (پوسیدگی (created_at))'.
6. 2 نشانه های رفتاری
نرخ کلیک، زمان ساکن، صرفه جویی در علاقه مندی ها (با بایاس ضد موضعی).
Deduplication - اسناد را با محتوای یکسان ~ (MinHash/SimHash) بکشید.
6. یادگیری 3 به رتبه (LTR)
ویژگی ها: BM25 زمینه، طول، طراوت، محبوبیت، مطابقت با عبارت، سرعت موقعیت.
مدل ها: LambdaMART/XGBoost ؛ معیارهای آفلاین NDCG @ k، MAP، Precision @ k ؛ آنلاین A/B
6. ۴ بازآرایی عصبی
دو مرحله ای: فراخوانی (BM25/ANN) → top-N (به عنوان مثال، 200) → cross-encoder rerank.
حسابداری هزینه: بودجه زمان، عقب نشینی بدون مرحله عصبی تحت بار.
6. 5 جستجوی ترکیبی (پراکنده + متراکم)
همجوشی (نرمال سازی سرعت و مجموع) یا چند مرحله ای (متراکم به عنوان rerank).
کالیبراسیون مهم است: min-max/z-score/نقشه برداری کمی.
7) فیلتر کردن، جنبه ها و دسترسی
7. 1 فیلتر
اپراتورها: '='، 'IN'، محدوده، پیشوند، جعبه جغرافیایی/جغرافیایی.
ترکیب: «و» توسط فیلتر، «OR» در مجموعه ای از ارزش ها (نام تجاری در...).
نوع امنیت: فیلدهای عددی به عنوان متن تجزیه نمی شوند.
7. 2 چهره
قیمت ارزان برای ساختارهای از پیش محاسبه شده
جنبه های «کاربردی» جنبه های باقی مانده پس از فیلتر را نشان می دهد.
7. 3 دسترسی/چند اجاره
فیلترهای امنیتی قبل از رتبه بندی (قبل از فیلتر) یکپارچه می شوند.
فیلدهای ABAC/RBAC در سند ('tenant _ id', 'visibility', 'acl').
نشانه درخواست امضا شده است ؛ با چند مستاجر - خودکار 'tenant _ id' filter.
8) صفحه بندی، نشانگر و سازگاری
صفحه بندی توسط seek-cursor توسط «(نمره، کراوات شکن)» یا توسط «(created_at، id)» هنگامی که بر اساس زمان مرتب شده اند.
«page _ token» مات با HMAC و TTL.
سازگاری: شاخص نزدیک به زمان واقعی (NRT): تاخیر 0. 5-2 ثانیه بین ضبط و دید. آن را در SLA ثبت کنید.
Cross-shard: جستجوی محلی → k-way ادغام شده توسط نظم جهانی، نشانگر هر-shard در نشانه.
9) AutoComplete و پیشنهادات
پیشنهادات: prefix-trie/edge-ngrams по полю «عنوان».
نمایش داده شد محبوب: ورود از کلیک → راهنمایی در محبوبیت + شخصی (بخش).
Spell-as-you-type: جستجوی فازی سریع با محدودیت فاصله '<= 1'.
GET /v1/suggest? q=kaz&limit=8&locale=ru
→ ["casino," "casual games,..."]
10) نکات برجسته و قطعه
فهرست موقعیتی → بازیابی عبارات با مسابقات.
فرار HTML، محدودیت طول، اتحاد قطعات همسایه.
قطعه رتبه بندی بر اساس تراکم شرایط مربوطه.
11) عملکرد، حافظه پنهان و SLO
شاخص ها: بخش های داغ در حافظه ؛ پست های فشرده سازی ؛ ارزش های دکتر برای جنبه ها.
کش: L1 (فرآیند)، L2 (Redis)، حافظه پنهان/جمع آوری شده ؛ غیر فعال توسط نسخه شاخص.
SLO: P95 <150-200 ms در «k <= 20»، P99 <500 ms ؛ در دسترس بودن 99 9%.
فشار پشتی: کاهش «k»، غیر فعال کردن مرحله عصبی زمانی که بیش از حد.
محدود کردن نرخ به کلید API/کاربر/مستاجر.
12) قابلیت مشاهده و معیارهای کیفیت
معیارهای فنی:- 'search _ latency _ ms' (P50/P95/P99), 'qps', 'timeouts', 'error _ rate'
- 'cache _ hit _ ratio', 'facet _ cache _ hit', 'rerank _ share'
- 'shard _ fanout'، 'merge _ time _ ms'، 'ann _ recall' @k
- NDCG @ k، MAP، MRR، Recall @ k، Precision @ k در نمونه های مشخص شده.
- CTR @k، sCTR (کلیک های راضی)، زمان توقف، отказ (نرخ pogostick).
A/B: معیارهای «guardrail» (تأخیر، خطاها) + هدف (پروکسی NDCG) را اصلاح کنید.
13) تست
تست واحد ارتباط: چک کردن مسابقات مورد انتظار برای درخواست های کلیدی.
Property-based: مقاومت در برابر typos/مترادف/زبان.
صفحه بندی: هیچ تکراری در مرز صفحه (به دنبال قرارداد).
امنیت: فیلترهای دسترسی همیشه اعمال می شوند (حتی در faset-count).
رگرسیون فرهنگ لغت: مترادف نسخه و قوانین فازی.
14) امنیت و حریم خصوصی
فیلدهای با PII به عنوان متن نمایه نمی شوند ؛ فروشگاه به طور جداگانه/رمزگذاری.
به حداقل رساندن منابع ذخیره شده (store = false, snippet fields only).
حریم خصوصی پرس و جو: درخواست های خام را با PII وارد نکنید ؛ ناشناس/هش کردن.
چند مستاجر: جداسازی شاخص سخت یا اجباری 'tenant _ id' filter.
15) مهاجرت و قابلیت همکاری
طرح شاخص نسخه (v1 → v2) با دو نوشتن و سوئیچ تدریجی.
سازگاری آنالایزر: هنوز زنجیره های قدیمی را دوباره فهرست نکنید.
چرخش واژهنامههای مترادف/توقف واژه: «نسخه»، «activated _ at»، برگشت.
16) دستور العمل های عملی
16. 1 جستجوی واژگان کلاسیک (BM25)
Fields: 'title ^ 3', 'tags ^ 2', 'body ^ 1'.
آنالایزر: زبان خاص + lemmatization.
فازی برای پرس و جوهای کوتاه («<= 3» نشانه)، «فازی = 1».
16. 2 پراکنده ترکیبی + متراکم
1. جستجوی ANN با جاسازی پرس و جو (k = 200)
2. ادغام با BM25 بالا 200
3. کالیبراسیون رتبه فیوژن
4. نگاهی بالا N (N = 20)، اختیاری - رتبه متقابل رمزگذار با بودجه کافی است.
16. 3 ناوبری کاتالوگ چهره
سخت پیش فیلتر شده توسط حقوق/مستاجر
جنبه های پس از فیلتر (شمارش از جمله فیلترهای فعال)
مرتب سازی بر اساس ارتباط و یا زمینه کسب و کار (قیمت/تازگی)
17) درخواست نمونه (pseudo-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"}
}
جغرافیایی:
json
{
"query": "casino",
"geo": {"lat": 59. 437, "lon": 24. 753, "radius_km": 50}
}
تکمیل خودکار:
json
{ "prefix": "evo", "field": "brand_suggest", "limit": 8 }
18) الگوهای UX
تراشه های فیلتر فعال + «تنظیم مجدد همه».
نتایج خالی: نشان می دهد «سعی کنید»... (مترادف، حذف فیلتر).
نکات صفر: نمایش داده شد محبوب/دسته.
صفحه بندی مکان نما (دکمه بیشتر) و پیمایش بی نهایت ؛ نشانگر ثابت فیلترهای کاربردی.
سوئیچ های جداگانه «typos را در نظر بگیرید»، «مطابقت دقیق عبارت».
19) خطاهای مکرر و ضد الگوهای
بدون کراوات شکن در هنگام مرتب سازی → دو برابر/جهش.
Facets بدون در نظر گرفتن فیلترهای فعال → شمارش «نادرست».
فیلترهای دسترسی پس از رتبه بندی را اعمال کنید.
مخلوط کردن زبان های مختلف با یک تحلیلگر.
صفحه بندی عمیق OFFSET/LIMIT به جای مکان نما به دنبال.
فازی نامحدود → انفجار با تاخیر.
20) چک لیست پیاده سازی
1. فیلدها و انواع آنها را تعریف کنید، آنالایزرهای هر محلی را اختصاص دهید.
2. طراحی شاخص معکوس + (گزینه.) وکتور ان ان
3. پیاده سازی تجزیه کننده پرس و جو و پیش فیلتر امن.
4. تنظیم BM25 و افزایش میدان ؛ جنبه ها را ضمیمه کنید.
5. نشانگرها را وارد کنید (مات، HMAC، TTL) و k-way ادغام شده توسط shards.
6. اضافه کردن تکمیل خودکار، برجسته، محافظ امن.
7. معیارهای: تاخیر، NDCG @ k، CTR ؛ L1/L2 کش
8. چارچوب A/B برای تنظیم ارتباط.
9. سند SLA: تاخیر NRT، محدودیت، تضمین سازگاری.
10. طرح مهاجرت: نسخه های شاخص، لغت نامه ها و تحلیلگران.
یک فیلتر خوب طراحی شده و لایه جستجوی متن کامل نه تنها یک شاخص سریع است، بلکه یک قرارداد پروتکل روشن با نشانگر، امنیت، UX قابل پیش بینی و ارتباط قابل اندازه گیری است. این رویکرد از هزاران تا میلیاردها اسناد و پشتیبانی از هر دو جستجوی واژگان کلاسیک و سناریوهای ترکیبی مدرن با رتبه بندی شبکه عصبی است.