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 లో క్యాష్ చేయబడతాయి (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 లోకి తిరిగి ఫీడ్ అవుతాయి: లైవ్ క్వెరీలను పొందండి.

సూచనలు

సాంకేతిక అంశాలు

సంబంధిత ఆర్టికల్స్

సారాంశం

మా సెర్చ్ సర్వీస్ ఒక ప్రత్యేక సర్వర్‌లో స్టాండ్‌అలోన్ Flask అప్లికేషన్‌గా నడుస్తుంది:

ఆర్కిటెక్చర్:

  • ప్రత్యేక సర్వర్‌లో స్టాండ్‌అలోన్ Flask అప్లికేషన్

  • క్యాషింగ్ మరియు వెక్టర్ సెర్చ్ కోసం Valkey (Redis ఫోర్క్)

  • ప్రధాన వెబ్ సర్వర్‌తో కమ్యూనికేషన్ కోసం HTTP API

APIలు:

  • /api/extract_filters - క్వెరీల నుండి ఫిల్టర్‌లను సంగ్రహించడం

  • /api/related - సారూప్య క్వెరీలను కనుగొనడం (వెక్టర్ సెర్చ్)

  • /api/autocomplete - క్వెరీలను సూచించడం (ప్రిఫిక్స్ మ్యాచింగ్)

  • /api/popular - ప్రజాదరణ పొందిన క్వెరీలను పొందడం

Valkey ఫీచర్లు:

  • వెక్టర్ సెర్చ్ (RediSearch మాడ్యూల్)

  • క్యాషింగ్ (ఫ్రేజ్ మ్యాపింగ్‌లకు 30-రోజుల TTL)

  • ఆటోకంప్లీట్ (సోర్టెడ్ సెట్‌లు)

  • పెర్సిస్టెన్స్ (AOF)

ప్రయోజనాలు:

  • స్వతంత్ర స్కేలింగ్

  • రిసోర్స్ ఐసోలేషన్

  • అధిక పెర్ఫార్మెన్స్ (Valkey క్యాషింగ్)

  • ఫాల్ట్ టాలరెన్స్ (గ్రేస్‌ఫుల్ డీగ్రేడేషన్)

ఈ ఆర్కిటెక్చర్ ప్రధాన వెబ్ సర్వర్‌ను స్పందించేలా ఉంచుతూ వేగవంతమైన, స్కేలబుల్ సెర్చ్‌ను సాధ్యం చేస్తుంది.


← డాక్యుమెంటేషన్ ఇండెక్స్‌కు తిరిగి వెళ్ళండి