शोध सेवा आर्किटेक्चर: स्टँडअलोन 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 किंवा JSON मधून phrase-to-filter mappings लोड करा
-
वर्ड बाउंड्री regex वापरून वाक्यांश जुळवा
-
संरचित फिल्टर परत करा
कॅचिंग: वाक्यांश मॅपिंग 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 मध्ये परत जातात: लाइव्ह क्वेरी मिळवा.
संदर्भ
तांत्रिक संकल्पना
-
Valkey - अधिकृत संकेतस्थळ
-
Redis - अधिकृत संकेतस्थळ (Valkey फोर्क)
-
RediSearch - व्हेक्टर शोध मॉड्यूल
-
कोसाइन समानता - विकिपीडिया
संबंधित लेख
-
फिल्टर एक्स्ट्रॅक्शन - फिल्टर कसे काढले जातात
-
संबंधित शोध निर्मिती - संबंधित शोध कसे निर्माण केले जातात
-
एम्बेडिंग धोरण - एम्बेडिंग्ज कशी निर्माण केली जातात
-
SEO पाइपलाइन विहंगावलोकन - संपूर्ण पाइपलाइन आर्किटेक्चर
-
Valkey मायग्रेशन - Valkey मध्ये डेटा लोड करणे
सारांश
आमची शोध सेवा एका वेगळ्या सर्व्हरवर स्टँडअलोन Flask ऍप्लिकेशन म्हणून चालते:
आर्किटेक्चर:
-
समर्पित सर्व्हरवर स्टँडअलोन Flask ऍप
-
कॅचिंग आणि व्हेक्टर शोधासाठी Valkey (Redis फोर्क)
-
मुख्य वेब सर्व्हरशी संवादासाठी HTTP API
API:
-
/api/extract_filters- क्वेरींमधून फिल्टर काढा -
/api/related- समान क्वेरी शोधा (व्हेक्टर शोध) -
/api/autocomplete- क्वेरी सुचवा (प्रीफिक्स मॅचिंग) -
/api/popular- लोकप्रिय क्वेरी मिळवा
Valkey वैशिष्ट्ये:
-
व्हेक्टर शोध (RediSearch मॉड्यूल)
-
कॅचिंग (वाक्यांश मॅपिंगसाठी ३०-दिवस TTL)
-
ऑटोकंप्लीट (सॉर्टेड सेट)
-
पर्सिस्टन्स (AOF)
फायदे:
-
स्वतंत्र स्केलिंग
-
संसाधन पृथक्करण
-
उच्च कार्यक्षमता (Valkey कॅचिंग)
-
फॉल्ट सहिष्णुता (ग्रेसफुल डिग्रेडेशन)
ही आर्किटेक्चर मुख्य वेब सर्व्हर प्रतिसादक्षम ठेवत जलद, स्केलेबल शोध सक्षम करते.