🔍 چرا شرکتهای بزرگ یک Search Service جداگانه میسازند؟
اوایل پروژه همه چیز ساده است.
کاربر عبارتی را جستجو میکند و با یک LIKE یا ()Contains روی دیتابیس، نتیجه برمیگردد.
اما وقتی حجم دادهها زیاد میشود، ناگهان هر سرویس شروع میکند به پیادهسازی Search، Pagination، Ranking، Filter، Autocomplete و Full-Text Search.
همینجاست که مفهوم Search Service وارد میشود.
به جای اینکه هر سرویس خودش مسئول جستجو باشد، یک سرویس مرکزی فقط روی Search و Indexing تمرکز میکند.
هر سرویس منطق Search خودش را دارد.
🏗 معماری با Search Service
Search Query
↓
Search Service
↓
Elasticsearch / OpenSearch
↑
Search Index
┌──────────┼──────────┐
↓ ↓ ↓
Service A Service B Service C
│ │ │
└──── Publish Events ─────┘
تمام سرویسها فقط دادههای خود را به Search Service ارسال میکنند و کاربران نیز تمام جستجوهای خود را از طریق همین سرویس انجام میدهند.
✅ مزایا
1️⃣ سرعت بسیار بالا
ءSearch Engineها برای جستجو طراحی شدهاند، نه Databaseهای رابطهای.
حتی روی میلیونها رکورد نیز پاسخ در چند میلیثانیه برمیگردد.
2️⃣ Full-Text Search
امکاناتی مانند:
• Fuzzy Search
• Typo Tolerance
• Stemming
• Synonym
• Ranking
• Relevance Score
به صورت پیشفرض در اختیار شما قرار میگیرد.
3️⃣ حذف بار از Database
دیگر Queryهای سنگین Search روی دیتابیس اصلی اجرا نمیشوند.
در نتیجه:
• Load کمتر
• Response Time بهتر
• Performance بیشتر
4️⃣ جستجوی یکپارچه
فرض کنید سیستم شما شامل:
• Articles
• Products
• Users
• Orders
باشد.
کاربر فقط یک بار Search انجام میدهد و نتایج از تمام سرویسها برمیگردد.
5️⃣ قابلیت توسعه بالا
به راحتی میتوانید اضافه کنید:
• Autocomplete
• Suggestion
• Highlight
• Faceted Search
• Geo Search
• Semantic Search
بدون اینکه Business Serviceها تغییری کنند.
6️⃣ قابلیت Ranking
میتوانید تعیین کنید:
• محبوبترین نتایج
• جدیدترین
• مرتبطترین
• پربازدیدترین
در ابتدای لیست نمایش داده شوند.
❌ معایب
1️⃣
Eventual Consistency
نتایج Search همیشه لحظهای بهروز نیستند.
ممکن است چند ثانیه طول بکشد تا Indexها بروزرسانی شوند.
2️⃣ پیچیدگی بیشتر
باید مفاهیمی مانند:
• Index
• Mapping
• Analyzer
• Shard
• Replica
• Reindex
را مدیریت کنید.
3️⃣ نیاز به همگامسازی دادهها
هر تغییری در دیتابیس باید وارد Search Index نیز شود.
4️⃣ هزینه بیشتر
نگهداری Elasticsearch یا OpenSearch منابع سختافزاری قابل توجهی نیاز دارد.
🚀 ءFlow اصولی پیادهسازی
مرحله 1️⃣
کاربر اطلاعات جدید ثبت میکند.
POST /articles
مرحله 2️⃣
ءBusiness Service اطلاعات را داخل Database ذخیره میکند.
مرحله 3️⃣
یک Domain Event منتشر میشود.
ArticleCreated
مرحله 4️⃣
ءSearch Service این Event را دریافت میکند.
مرحله 5️⃣
اطلاعات داخل Search Index ذخیره میشود.
Elasticsearch
OpenSearch
مرحله 6️⃣
کاربر درخواست Search ارسال میکند.
GET /search?q=DDD
مرحله 7️⃣
ءSearch Service نتایج را از Index خوانده و به Client برمیگرداند.
📋 نکاتی که حتماً باید رعایت شوند
🔸 ءSearch Database را جایگزین Database اصلی نکنید.
🔸 از Event-Driven Architecture برای بروزرسانی Index استفاده کنید.
🔸 ءQueryهای Search مستقیماً روی Database اجرا نشوند.
🔸 ءIndexها Version داشته باشند.
🔸 برای عملیات Reindex برنامه مشخصی داشته باشید.
🔸 ءMappingها را از ابتدا با دقت طراحی کنید.
🔸 از Analyzer مناسب برای زبانهای مختلف استفاده کنید.
🔸 ءShard و Replicaها بر اساس حجم داده تنظیم شوند.
🔸 ءMonitoring برای وضعیت Indexها فعال باشد.
🔸 در صورت خطا، عملیات Indexing قابلیت Retry داشته باشد.
⭐️ برای بهتر شدن Search Service چه کارهایی انجام دهیم؟
✅ Incremental Indexing
✅ Background Indexing
✅ Event-Driven Synchronization
✅ Autocomplete
✅ Search Suggestions
✅ Highlight Search Results
✅ Faceted Search
✅ Geo Search
✅ Semantic Search با AI
✅ Synonym Dictionary
✅ Spell Correction
✅ Cache نتایج پرتکرار
✅ Distributed Search Cluster
✅ Zero-Downtime Reindex
🔖هشتگها:
#search #elasticsearch #opensearch #eventdriven #fulltextsearch