Search Service Architecture: Standalone Flask Application with Valkey

यह लेख बताता है कि हमारी सर्च सेवा एक अलग सर्वर पर स्टैंडअलोन Flask एप्लिकेशन के रूप में कैसे चलती है, जो हाई-परफॉर्मेंस वेक्टर सर्च, कैशिंग और ऑटोकम्पलीट के लिए Valkey (Redis फोर्क) का उपयोग करती है।

समस्या: सर्च परफॉर्मेंस और स्केलेबिलिटी

सर्च ऑपरेशन कम्प्यूटेशनल रूप से महंगे हैं:

  • फ़िल्टर निष्कर्षण: हर क्वेरी के विरुद्ध 2,500+ वाक्यांशों का मिलान करें

  • संबंधित खोजें: 65K क्वेरीज़ के बीच समानता की गणना करें

  • ऑटोकम्पलीट: 65K क्वेरीज़ पर प्रीफिक्स मिलान करें

  • उत्पाद फ़िल्टरिंग: 5K+ उत्पादों को कई मानदंडों द्वारा फ़िल्टर करें

मुख्य वेब सर्वर पर इन ऑपरेशनों को चलाने से निम्नलिखित समस्याएँ होती हैं:

  • धीमी पेज लोड: सर्च अन्य अनुरोधों को ब्लॉक कर देता है

  • मेमोरी दबाव: एम्बेडिंग्स एक विशाल मेमोरी फुटप्रिंट के लिए जिम्मेदार होती हैं

  • CPU विवाद: समानता गणना CPU-गहन होती है

  • स्केलिंग कठिनाई: सर्च को स्वतंत्र रूप से स्केल नहीं किया जा सकता

हमें एक समर्पित सर्च सेवा की आवश्यकता है जो स्वतंत्र रूप से स्केल हो सके।

समाधान: स्टैंडअलोन सर्च सेवा

हम एक समर्पित सर्वर पर एक अलग Flask एप्लिकेशन चलाते हैं:

Main Web Server
    ↓ HTTP API calls
Search Service
    ↓ Valkey queries
Valkey Server

यह आर्किटेक्चर प्रदान करता है:

  • स्वतंत्र स्केलिंग: मुख्य वेब सर्वर को प्रभावित किए बिना सर्च सेवा को स्केल करें

  • संसाधन अलगाव: सर्च ऑपरेशन मुख्य वेब सर्वर को प्रभावित नहीं करते

  • कैशिंग: तेज़ दोहराव वाली क्वेरीज़ के लिए Valkey परिणाम कैश करता है

  • उच्च उपलब्धता: सर्च सेवा मुख्य वेब सर्वर को प्रभावित किए बिना पुनरारंभ हो सकती है

सर्च सेवा के घटक

1. फ़िल्टर निष्कर्षण API

  • एंडपॉइंट: /api/extract_filters

  • उद्देश्य: प्राकृतिक भाषा क्वेरीज़ से संरचित फ़िल्टर निकालें

  • उदाहरण:

GET /api/extract_filters?q=mini+pc+16gb+ram

Response:
{
  "Form Factor": "Mini PC",
  "Main Memory": "16"
}

कार्यान्वयन:

कैशिंग: वाक्यांश मैपिंग Valkey में कैश की जाती हैं (30-दिन का TTL)

2. संबंधित खोज API

  • एंडपॉइंट: /api/related

  • उद्देश्य: वेक्टर सर्च का उपयोग करके शब्दार्थ रूप से समान क्वेरीज़ खोजें

  • उदाहरण:

POST /api/related
{
  "query": "mini pc",
  "limit": 10
}

Response:
{
  "related": [
    {"query": "small computer", "similarity": 0.92},
    {"query": "compact desktop", "similarity": 0.89},
    {"query": "mini pc 8gb", "similarity": 0.87}
  ]
}

कार्यान्वयन:

  • all-mpnet-base-v2 का उपयोग करके क्वेरी एम्बेड करें

  • निकटतम पड़ोसियों के लिए Valkey RediSearch क्वेरी करें

  • समानता द्वारा क्रमबद्ध शीर्ष N परिणाम लौटाएँ

कैशिंग: परिणाम Valkey में कैश किए जाते हैं (7-दिन का TTL)

3. ऑटोकम्पलीट API

  • एंडपॉइंट: /api/autocomplete

  • उद्देश्य: उपयोगकर्ता द्वारा टाइप करते समय क्वेरीज़ सुझाएँ

  • उदाहरण:

GET /api/autocomplete?q=mini+p&limit=5

Response:
{
  "suggestions": [
    "mini pc",
    "mini pc 16gb",
    "mini pc 8gb ram",
    "mini pc fanless",
    "mini pc windows 11"
  ]
}

कार्यान्वयन:

  • प्रीफिक्स मिलान के साथ Valkey RediSearch क्वेरी करें

  • लोकप्रियता के आधार पर रैंक करें (इम्प्रेशन + क्लिक स्कोर)

  • शीर्ष N सुझाव लौटाएँ

कैशिंग: Valkey में ऑटोकम्पलीट इंडेक्स (प्रतिदिन अपडेट होता है)

4. लोकप्रिय क्वेरीज़ API

  • एंडपॉइंट: /api/popular

  • उद्देश्य: सबसे लोकप्रिय क्वेरीज़ प्राप्त करें

  • उदाहरण:

GET /api/popular?limit=10

Response:
{
  "queries": [
    "mini pc",
    "thin client",
    "industrial pc",
    "all in one pc"
  ]
}

कार्यान्वयन:

  • Valkey या JSON से क्वेरीज़ लोड करें

  • ट्रैफ़िक स्कोर (इम्प्रेशन + क्लिक) के आधार पर क्रमबद्ध करें

  • शीर्ष N क्वेरीज़ लौटाएँ

कैशिंग: लोकप्रिय क्वेरीज़ Valkey में कैश की जाती हैं (30-दिन का TTL)

Valkey एकीकरण

Valkey एक Redis फोर्क है जो प्रदान करता है:

  • वेक्टर सर्च: समानता खोज के लिए RediSearch मॉड्यूल

  • कैशिंग: तेज़ इन-मेमोरी की-वैल्यू स्टोर

  • ऑटोकम्पलीट: सॉर्टेड सेट के साथ प्रीफिक्स मिलान

  • स्थायित्व: स्थायित्व के लिए AOF (Append-Only File)

RediSearch के साथ वेक्टर सर्च

हम वेक्टर समानता खोज के लिए Valkey के 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 निकटतम पड़ोसियों को लौटाता है।

कैशिंग रणनीति

हम Valkey में कई डेटा प्रकार कैश करते हैं:

वाक्यांश मैपिंग (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})

सॉर्टेड सेट के साथ ऑटोकम्पलीट

हम ऑटोकम्पलीट के लिए Valkey सॉर्टेड सेट का उपयोग करते हैं:

इंडेक्स संरचना:

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")
# Internally calls: 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 = {}  # Fallback to empty filters

यह सुनिश्चित करता है कि सर्च सेवा के डाउन होने पर भी मुख्य वेब सर्वर कार्य करता रहे।

नेटवर्क कॉन्फ़िगरेशन

सभी सर्वर एक निजी नेटवर्क पर हैं:

  • मुख्य वेब सर्वर: सर्च सेवा और Valkey तक पहुँच सकता है

  • सर्च सेवा: Valkey तक पहुँच सकती है

  • Valkey: केवल मुख्य वेब सर्वर और सर्च सेवा से ही एक्सेस योग्य

सर्च सेवा या Valkey तक कोई बाहरी पहुँच नहीं है।

SEO पाइपलाइन के साथ एकीकरण

सर्च सेवा SEO पाइपलाइन के साथ एकीकृत होती है:

चरण 11: Valkey में माइग्रेट करें

SEO पाइपलाइन Valkey में डेटा लोड करती है:

# Load query embeddings
for query, embedding in zip(queries, embeddings):
    client.hset(f"query:{query_hash}", mapping={
        "query": query,
        "embedding": embedding.tobytes(),
        "score": score
    })

# Create RediSearch index
client.ft("queries_idx").create_index([...])

विवरण के लिए Valkey माइग्रेशन देखें।

क्वेरी लॉगिंग

सर्च सेवा 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: लाइव क्वेरीज़ प्राप्त करें में वापस फीड होते हैं।

संदर्भ

तकनीकी अवधारणाएँ

  • Valkey - आधिकारिक वेबसाइट

  • Redis - आधिकारिक वेबसाइट (Valkey फोर्क)

  • RediSearch - वेक्टर सर्च मॉड्यूल

  • Cosine Similarity - विकिपीडिया

संबंधित लेख

सारांश

हमारी सर्च सेवा एक अलग सर्वर पर स्टैंडअलोन Flask एप्लिकेशन के रूप में चलती है:

आर्किटेक्चर:

  • समर्पित सर्वर पर स्टैंडअलोन Flask ऐप

  • कैशिंग और वेक्टर सर्च के लिए Valkey (Redis फोर्क)

  • मुख्य वेब सर्वर के साथ संचार के लिए HTTP API

API:

  • /api/extract_filters - क्वेरीज़ से फ़िल्टर निकालें

  • /api/related - समान क्वेरीज़ खोजें (वेक्टर सर्च)

  • /api/autocomplete - क्वेरीज़ सुझाएँ (प्रीफिक्स मिलान)

  • /api/popular - लोकप्रिय क्वेरीज़ प्राप्त करें

Valkey सुविधाएँ:

  • वेक्टर सर्च (RediSearch मॉड्यूल)

  • कैशिंग (वाक्यांश मैपिंग के लिए 30-दिन का TTL)

  • ऑटोकम्पलीट (सॉर्टेड सेट)

  • स्थायित्व (AOF)

लाभ:

  • स्वतंत्र स्केलिंग

  • संसाधन अलगाव

  • उच्च प्रदर्शन (Valkey कैशिंग)

  • दोष सहिष्णुता (सुगम गिरावट)

यह आर्किटेक्चर तेज़, स्केलेबल सर्च सक्षम बनाता है और मुख्य वेब सर्वर को प्रतिक्रियाशील बनाए रखता है।


← दस्तावेज़ीकरण सूचकांक पर वापस जाएँ