سرچ سروس آرکیٹیکچر: اسٹینڈ اون فلیسک ایپلیکیشن کے ساتھ والکی
یہ مضمون بتاتا ہے کہ کیسے ہماری سرچ سروس ایک علیحدہ سرور پر ایک اسٹینڈ اون فلیسک ایپلیکیشن کے طور پر چلتی ہے، جو ہائی پرفارمنس ویکٹر سرچ، کیشنگ، اور آٹو کمپلیٹ کے لیے والکی (Redis fork) استعمال کرتی ہے۔
مسئلہ: سرچ کی کارکردگی اور اسکیل ایبلٹی
سرچ آپریشنز کمپیوٹیشنلی مہنگے ہیں:
-
فلٹر ایکسٹریکشن: ہر کوئری کے خلاف 2,500+ فقرات کو میچ کریں
-
متعلقہ سرچز: 65K کوئریز کے درمیان مشابہت کا حساب لگائیں
-
آٹو کمپلیٹ: 65K کوئریز پر پریفکس میچنگ
-
پروڈکٹ فلٹرنگ: 5K+ پروڈکٹس کو متعدد معیارات کے مطابق فلٹر کریں
ان آپریشنز کو مین ویب سرور پر چلانے سے ہوتا ہے:
-
سست صفحہ لوڈز: سرچ دوسرے درخواستوں کو بلاک کرتی ہے
-
میموری کا دباؤ: ایمبیڈنگز میموری کا ایک بڑا حصہ لیتی ہیں
-
سی پی یو مقابلہ: مشابہت کا حساب سی پی یو انٹینسیو ہے
-
اسکیل کرنے میں دشواری: سرچ کو آزادانہ طور پر اسکیل نہیں کر سکتے
ہمیں ایک مخصوص سرچ سروس کی ضرورت ہے جو آزادانہ طور پر اسکیل کر سکے۔
حل: اسٹینڈ اون سرچ سروس
ہم ایک مخصوص سرور پر ایک علیحدہ فلیسک ایپلیکیشن چلاتے ہیں:
مین ویب سرور
↓ HTTP API کالز
سرچ سروس
↓ والکی کوئریز
والکی سرور
یہ آرکیٹیکچر فراہم کرتا ہے:
-
آزادانہ اسکیلنگ: مین ویب سرور کو متاثر کیے بغیر سرچ سروس کو اسکیل کریں
-
وسائل کی علیحدگی: سرچ آپریشنز مین ویب سرور پر اثر نہیں ڈالتے
-
کیشنگ: والکی بار بار کیے جانے والے کوئریز کے نتائج تیز رفتاری سے کیش کرتی ہے
-
ہائی ایویلیبیلٹی: سرچ سروس مین ویب سرور کو متاثر کیے بغیر دوبارہ شروع ہو سکتی ہے
سرچ سروس کے اجزاء
1. فلٹر ایکسٹریکشن API
-
اینڈ پوائنٹ:
/api/extract_filters -
مقصد: قدرتی زبان کے کوئریز سے ساختہ فلٹرز نکالیں
-
مثال:
GET /api/extract_filters?q=mini+pc+16gb+ram
جواب:
{
"Form Factor": "Mini PC",
"Main Memory": "16"
}
عمل درآمد:
-
والکی یا JSON سے فقرہ-سے-فلٹر میپنگز لوڈ کریں
-
الفاظ کی سرحد والی ریجیکس کا استعمال کرتے ہوئے فقرات کو میچ کریں
-
ساختہ فلٹرز واپس کریں
کیشنگ: فقرہ میپنگز والکی میں کیش ہوتی ہیں (30-دن TTL)
2. متعلقہ سرچز API
-
اینڈ پوائنٹ:
/api/related -
مقصد: ویکٹر سرچ کا استعمال کرتے ہوئے معنوی طور پر ملتی جلتی کوئریز تلاش کریں
-
مثال:
POST /api/related
{
"query": "mini pc",
"limit": 10
}
جواب:
{
"related": [
{"query": "small computer", "similarity": 0.92},
{"query": "compact desktop", "similarity": 0.89},
{"query": "mini pc 8gb", "similarity": 0.87}
]
}
عمل درآمد:
-
all-mpnet-base-v2 کا استعمال کرتے ہوئے کوئری کو ایمبیڈ کریں
-
قریبی پڑوسیوں کے لیے والکی RediSearch کو کوئری کریں
-
مشابہت کے لحاظ سے ترتیب شدہ ٹاپ N نتائج واپس کریں
کیشنگ: نتائج والکی میں کیش ہوتے ہیں (7-دن TTL)
3. آٹو کمپلیٹ API
-
اینڈ پوائنٹ:
/api/autocomplete -
مقصد: صارف کے ٹائپ کرتے وقت کوئریز تجویز کریں
-
مثال:
GET /api/autocomplete?q=mini+p&limit=5
جواب:
{
"suggestions": [
"mini pc",
"mini pc 16gb",
"mini pc 8gb ram",
"mini pc fanless",
"mini pc windows 11"
]
}
عمل درآمد:
-
پریفکس میچنگ کے ساتھ والکی RediSearch کو کوئری کریں
-
مقبولیت (امپریشن + کلک سکور) کے لحاظ سے درجہ بندی کریں
-
ٹاپ N تجاویز واپس کریں
کیشنگ: آٹو کمپلیٹ انڈیکس والکی میں ہوتا ہے (روزانہ اپ ڈیٹ ہوتا ہے)
4. مقبول کوئریز API
-
اینڈ پوائنٹ:
/api/popular -
مقصد: سب سے زیادہ مقبول کوئریز حاصل کریں
-
مثال:
GET /api/popular?limit=10
جواب:
{
"queries": [
"mini pc",
"thin client",
"industrial pc",
"all in one pc"
]
}
عمل درآمد:
-
والکی یا JSON سے کوئریز لوڈ کریں
-
ٹریفک سکور (امپریشنز + کلکس) کے لحاظ سے ترتیب دیں
-
ٹاپ N کوئریز واپس کریں
کیشنگ: مقبول کوئریز والکی میں کیش ہوتی ہیں (30-دن TTL)
والکی انٹیگریشن
والکی ایک Redis fork ہے جو فراہم کرتی ہے:
-
ویکٹر سرچ: مشابہت کی سرچ کے لیے RediSearch ماڈیول
-
کیشنگ: فاسٹ ان-میموری کی-ویلیو اسٹور
-
آٹو کمپلیٹ: سورٹڈ سیٹس کے ساتھ پریفکس میچنگ
-
پرسیسٹنس: ڈیورایبلٹی کے لیے AOF (Append-Only File)
RediSearch کے ساتھ ویکٹر سرچ
ہم ویکٹر مشابہت کی سرچ کے لیے والکی کے RediSearch ماڈیول کا استعمال کرتے ہیں:
انڈیکس تخلیق:
client.ft("queries_idx").create_index([
VectorField("embedding", "FLAT", {
"TYPE": "FLOAT32",
"DIM": 768,
"DISTANCE_METRIC": "COSINE"
}),
TextField("query"),
NumericField("score")
])
ویکٹر سرچ:
query_embedding = model.encode(query)
results = client.ft("queries_idx").search(
Query("*=>[KNN 10 @embedding $vec AS score]")
.sort_by("score")
.return_fields("query", "score")
.dialect(2),
query_params={"vec": query_embedding.tobytes()}
)
یہ کوسائن مشابہت کے لحاظ سے 10 قریبی پڑوسی واپس کرتا ہے۔
کیشنگ کی حکمت عملی
ہم والکی میں متعدد ڈیٹا کی اقسام کو کیش کرتے ہیں:
فقرہ میپنگز (30-دن TTL):
client.setex(
"seo:phrase_mappings",
30 * 24 * 3600,
json.dumps(phrase_mappings)
)
متعلقہ سرچز (7-دن TTL):
cache_key = f"related:{query_hash}"
client.setex(cache_key, 7 * 24 * 3600, json.dumps(results))
مقبول کوئریز (30-دن TTL):
client.setex(
"seo:popular_queries",
30 * 24 * 3600,
json.dumps(popular_queries)
)
آٹو کمپلیٹ انڈیکس (روزانہ اپ ڈیٹ ہوتا ہے):
for query, score in queries:
client.zadd("autocomplete:mini", {query: score})
سورٹڈ سیٹس کے ساتھ آٹو کمپلیٹ
ہم آٹو کمپلیٹ کے لیے والکی سورٹڈ سیٹس کا استعمال کرتے ہیں:
انڈیکس کی ساخت:
autocomplete:m → ["mini pc": 5000, "mini computer": 3000]
autocomplete:mi → ["mini pc": 5000, "mini computer": 3000]
autocomplete:min → ["mini pc": 5000, "mini computer": 3000]
autocomplete:mini → ["mini pc": 5000, "mini computer": 3000]
پریفکس لک اپ:
prefix = "mini"
results = client.zrevrange(f"autocomplete:{prefix}", 0, 9, withscores=True)
یہ "mini" سے شروع ہونے والی ٹاپ 10 کوئریز، سکور کے لحاظ سے ترتیب شدہ، واپس کرتا ہے۔
API مواصلات
مین ویب سرور HTTP کے ذریعے سرچ سروس کو کال کرتا ہے:
فلٹر ایکسٹریکشن
from app.shared.filter_service import extract_filters_from_query
filters = extract_filters_from_query("mini pc 16gb ram")
# اندرونی طور پر کال کرتا ہے: GET SEARCH_SERVICE_URL/api/extract_filters?q=...
متعلقہ سرچز
import requests
response = requests.post(
"SEARCH_SERVICE_URL/api/related",
json={"query": "mini pc", "limit": 10},
timeout=2
)
related = response.json()["related"]
آٹو کمپلیٹ
response = requests.get(
"SEARCH_SERVICE_URL/api/autocomplete",
params={"q": "mini p", "limit": 5},
timeout=1
)
suggestions = response.json()["suggestions"]
غلطی ہینڈلنگ اور فال بیکس
مین ویب سرور سرچ سروس کی ناکامیوں کو نرمی سے ہینڈل کرتا ہے:
try:
filters = extract_filters_from_query(query)
except Exception as e:
logger.error(f"Search service failed: {e}")
filters = {} # خالی فلٹرز پر فال بیک
یہ یقینی بناتا ہے کہ مین ویب سرور کام کرتا رہے یہاں تک کہ اگر سرچ سروس ڈاؤن ہو۔
نیٹ ورک کنفیگریشن
تمام سرورز ایک پرائیویٹ نیٹ ورک پر ہیں:
-
مین ویب سرور: سرچ سروس اور والکی تک رسائی حاصل کر سکتا ہے
-
سرچ سروس: والکی تک رسائی حاصل کر سکتی ہے
-
والکی: صرف مین ویب سرور اور سرچ سروس سے قابل رسائی
سرچ سروس یا والکی تک بیرونی رسائی نہیں ہے۔
SEO پائپ لائن کے ساتھ انٹیگریشن
سرچ سروس SEO پائپ لائن کے ساتھ مربوط ہے:
مرحلہ 11: والکی پر منتقلی
SEO پائپ لائن والکی میں ڈیٹا لوڈ کرتی ہے:
# کوئری ایمبیڈنگز لوڈ کریں
for query, embedding in zip(queries, embeddings):
client.hset(f"query:{query_hash}", mapping={
"query": query,
"embedding": embedding.tobytes(),
"score": score
})
# RediSearch انڈیکس بنائیں
client.ft("queries_idx").create_index([...])
تفصیلات کے لیے والکی پر منتقلی دیکھیں۔
کوئری لاگنگ
سرچ سروس SEO پائپ لائن کے لیے کوئریز لاگ کرتی ہے:
log_entry = {
"timestamp": datetime.now(timezone.utc).isoformat(),
"query": query,
"filters_extracted": filters,
"results_count": len(results)
}
with open(SEO_LIVE_QUERIES_LOG, "a") as f:
f.write(json.dumps(log_entry) + "\n")
یہ لاگز مرحلہ 1d: لائیو کوئریز حاصل کریں میں واپس فیڈ ہوتے ہیں۔
حوالہ جات
تکنیکی تصورات
-
والکی - آفیشل ویب سائٹ
-
Redis - آفیشل ویب سائٹ (والکی fork)
-
RediSearch - ویکٹر سرچ ماڈیول
-
کوسائن مشابہت - ویکیپیڈیا
متعلقہ مضامین
-
فلٹر ایکسٹریکشن - فلٹرز کیسے نکالے جاتے ہیں
-
متعلقہ سرچ جنریشن - متعلقہ سرچز کیسے بنتی ہیں
-
ایمبیڈنگ حکمت عملی - ایمبیڈنگز کیسے بنتی ہیں
-
SEO پائپ لائن کا جائزہ - مکمل پائپ لائن آرکیٹیکچر
-
والکی پر منتقلی - والکی میں ڈیٹا لوڈ کرنا
خلاصہ
ہماری سرچ سروس ایک علیحدہ سرور پر ایک اسٹینڈ اون فلیسک ایپلیکیشن کے طور پر چلتی ہے:
آرکیٹیکچر:
-
مخصوص سرور پر اسٹینڈ اون فلیسک ایپ
-
کیشنگ اور ویکٹر سرچ کے لیے والکی (Redis fork)
-
مین ویب سرور کے ساتھ مواصلات کے لیے HTTP API
APIs:
-
/api/extract_filters- کوئریز سے فلٹرز نکالیں -
/api/related- ملتی جلتی کوئریز تلاش کریں (ویکٹر سرچ) -
/api/autocomplete- کوئریز تجویز کریں (پریفکس میچنگ) -
/api/popular- مقبول کوئریز حاصل کریں
والکی کی خصوصیات:
-
ویکٹر سرچ (RediSearch ماڈیول)
-
کیشنگ (فقرہ میپنگز کے لیے 30-دن TTL)
-
آٹو کمپلیٹ (سورٹڈ سیٹس)
-
پرسیسٹنس (AOF)
فوائد:
- آزاد