शोध सेवा आर्किटेक्चर: स्टँडअलोन Flask ऍप्लिकेशन Valkey सह

हा लेख स्पष्ट करतो की आमची शोध सेवा एका वेगळ्या सर्व्हरवर स्टँडअलोन Flask ऍप्लिकेशन म्हणून कशी चालते, उच्च-कार्यक्षमता व्हेक्टर शोध, कॅचिंग आणि ऑटोकंप्लीटसाठी Valkey (Redis फोर्क) वापरून.

समस्या: शोध कार्यक्षमता आणि स्केलेबिलिटी

शोध ऑपरेशन्स संगणकीयदृष्ट्या महाग असतात:

  • फिल्टर एक्स्ट्रॅक्शन: प्रत्येक क्वेरीविरुद्ध २,५००+ वाक्यांश जुळवणे

  • संबंधित शोध: ६५K क्वेरींमध्ये समानता मोजणे

  • ऑटोकंप्लीट: ६५K क्वेरींवर प्रीफिक्स मॅचिंग

  • उत्पादन फिल्टरिंग: एकाधिक निकषांनुसार ५K+ उत्पादने फिल्टर करणे

मुख्य वेब सर्व्हरवर या ऑपरेशन्स चालवल्याने पुढील समस्या उद्भवतात:

  • संथ पृष्ठ लोड: शोध इतर विनंत्या ब्लॉक करतो

  • मेमरी दबाव: एम्बेडिंग्जमुळे प्रचंड मेमरी वापर होतो

  • 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 मध्ये कॅशे केली जातात (३०-दिवस 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 मध्ये कॅशे केले जातात (७-दिवस 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 मध्ये कॅशे केल्या जातात (३०-दिवस 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()}
)

हे कोसाइन समानतेनुसार सर्वात जवळचे १० शेजारी परत करते.

कॅचिंग धोरण

आम्ही Valkey मध्ये अनेक डेटा प्रकार कॅशे करतो:

वाक्यांश मॅपिंग (३०-दिवस TTL):

client.setex(
    "seo:phrase_mappings",
    30 * 24 * 3600,
    json.dumps(phrase_mappings)
)

संबंधित शोध (७-दिवस TTL):

cache_key = f"related:{query_hash}"
client.setex(cache_key, 7 * 24 * 3600, json.dumps(results))

लोकप्रिय क्वेरी (३०-दिवस 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" ने सुरू होणाऱ्या सर्वोत्तम १० क्वेरी, स्कोअरनुसार क्रमवारीत परत करते.

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 मध्ये डेटा लोड करते:

```python
# 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 मध्ये परत जातात: लाइव्ह क्वेरी मिळवा.

संदर्भ

तांत्रिक संकल्पना

संबंधित लेख

सारांश

आमची शोध सेवा एका वेगळ्या सर्व्हरवर स्टँडअलोन Flask ऍप्लिकेशन म्हणून चालते:

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

  • समर्पित सर्व्हरवर स्टँडअलोन Flask ऍप

  • कॅचिंग आणि व्हेक्टर शोधासाठी Valkey (Redis फोर्क)

  • मुख्य वेब सर्व्हरशी संवादासाठी HTTP API

API:

  • /api/extract_filters - क्वेरींमधून फिल्टर काढा

  • /api/related - समान क्वेरी शोधा (व्हेक्टर शोध)

  • /api/autocomplete - क्वेरी सुचवा (प्रीफिक्स मॅचिंग)

  • /api/popular - लोकप्रिय क्वेरी मिळवा

Valkey वैशिष्ट्ये:

  • व्हेक्टर शोध (RediSearch मॉड्यूल)

  • कॅचिंग (वाक्यांश मॅपिंगसाठी ३०-दिवस TTL)

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

  • पर्सिस्टन्स (AOF)

फायदे:

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

  • संसाधन पृथक्करण

  • उच्च कार्यक्षमता (Valkey कॅचिंग)

  • फॉल्ट सहिष्णुता (ग्रेसफुल डिग्रेडेशन)

ही आर्किटेक्चर मुख्य वेब सर्व्हर प्रतिसादक्षम ठेवत जलद, स्केलेबल शोध सक्षम करते.


← दस्तऐवज निर्देशांकाकडे परत