Search Service ఆర్కిటెక్చర్: స్టాండ్అలోన్ Flask అప్లికేషన్ Valkeyతో
ఈ ఆర్టికల్ మా search service ఒక ప్రత్యేక సర్వర్లో స్టాండ్అలోన్ 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 లేదా JSON నుండి లోడ్ చేయండి
-
word boundary regex ఉపయోగించి పదబంధాలను మ్యాచ్ చేయండి
-
నిర్మాణాత్మక ఫిల్టర్లను రిటర్న్ చేయండి
క్యాషింగ్: ఫ్రేజ్ మ్యాపింగ్లు 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
This ensures the main web server continues functioning even if the search service is down.
### నెట్వర్క్ కాన్ఫిగరేషన్
అన్ని సర్వర్లు ప్రైవేట్ నెట్వర్క్లో ఉన్నాయి:
- **ప్రధాన వెబ్ సర్వర్**: సెర్చ్ సర్వీస్ మరియు Valkey యాక్సెస్ చేయగలదు
- **సెర్చ్ సర్వీస్**: Valkey యాక్సెస్ చేయగలదు
- **Valkey**: ప్రధాన వెబ్ సర్వర్ మరియు సెర్చ్ సర్వీస్ నుండి మాత్రమే యాక్సెస్ చేయవచ్చు
సెర్చ్ సర్వీస్ లేదా Valkeyకు బాహ్య యాక్సెస్ లేదు.
## SEO పైప్లైన్తో ఇంటిగ్రేషన్
సెర్చ్ సర్వీస్ SEO పైప్లైన్తో అనుసంధానించబడుతుంది:
### Step 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")
ఈ లాగ్లు Step 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 మాడ్యూల్)
-
క్యాషింగ్ (ఫ్రేజ్ మ్యాపింగ్లకు 30-రోజుల TTL)
-
ఆటోకంప్లీట్ (సోర్టెడ్ సెట్లు)
-
పెర్సిస్టెన్స్ (AOF)
ప్రయోజనాలు:
-
స్వతంత్ర స్కేలింగ్
-
రిసోర్స్ ఐసోలేషన్
-
అధిక పెర్ఫార్మెన్స్ (Valkey క్యాషింగ్)
-
ఫాల్ట్ టాలరెన్స్ (గ్రేస్ఫుల్ డీగ్రేడేషన్)
ఈ ఆర్కిటెక్చర్ ప్రధాన వెబ్ సర్వర్ను స్పందించేలా ఉంచుతూ వేగవంతమైన, స్కేలబుల్ సెర్చ్ను సాధ్యం చేస్తుంది.