സെർച്ച് സർവീസ് ആർക്കിടെക്ചർ: വാൽക്കീയുമായുള്ള സ്റ്റാൻഡലോൺ Flask ആപ്ലിക്കേഷൻ

ഞങ്ങളുടെ സെർച്ച് സർവീസ് എങ്ങനെ ഒരു പ്രത്യേക സെർവറിൽ സ്റ്റാൻഡലോൺ 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"
}

നടപ്പിലാക്കൽ:

  • phrase-to-filter mappings 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 (അപ്പെൻഡ്-ഓൺലി ഫയൽ)

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")
# ആന്തരികമായി വിളിക്കുന്നു: 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 = {}  # ശൂന്യമായ ഫിൽട്ടറുകളിലേക്ക് ഫാൾബാക്ക്

സെർച്ച് സർവീസ് ഡൗണാണെങ്കിൽപ്പോലും പ്രധാന വെബ് സെർവർ തുടർന്നും പ്രവർത്തിക്കുന്നുവെന്ന് ഇത് ഉറപ്പാക്കുന്നു.

നെറ്റ്വർക്ക് കോൺഫിഗറേഷൻ

എല്ലാ സെർവറുകളും ഒരു സ്വകാര്യ നെറ്റ്വർക്കിലാണ്:

  • പ്രധാന വെബ് സെർവർ: സെർച്ച് സർവീസിലേക്കും Valkey-യിലേക്കും ആക്സസ് ഉണ്ട്

  • സെർച്ച് സർവീസ്: Valkey-യിലേക്ക് ആക്സസ് ഉണ്ട്

  • Valkey: പ്രധാന വെബ് സെർവറിൽ നിന്നും സെർച്ച് സർവീസിൽ നിന്നും മാത്രം ആക്സസ് ചെയ്യാവുന്നതാണ്

സെർച്ച് സർവീസിലേക്കോ Valkey-യിലേക്കോ ബാഹ്യ ആക്സസ് ഇല്ല.

SEO പൈപ്പ്ലൈനുമായുള്ള സംയോജനം

സെർച്ച് സർവീസ് SEO പൈപ്പ്ലൈനുമായി സംയോജിപ്പിക്കുന്നു:

ഘട്ടം 11: Valkey-യിലേക്ക് മൈഗ്രേറ്റ് ചെയ്യുക

SEO പൈപ്പ്ലൈൻ ഡാറ്റ Valkey-യിലേക്ക് ലോഡ് ചെയ്യുന്നു:

# ക്വെറി എംബെഡിംഗുകൾ ലോഡ് ചെയ്യുക
for query, embedding in zip(queries, embeddings):
    client.hset(f"query:{query_hash}", mapping={
        "query": query,
        "embedding": embedding.tobytes(),
        "score": score
    })

# RediSearch സൂചിക സൃഷ്ടിക്കുക
client.ft("queries_idx").create_index([...])

വിശദാംശങ്ങൾക്ക് Valkey Migration കാണുക.

ക്വെറി ലോഗിംഗ്

സെർച്ച് സർവീസ് 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-ലേക്ക് തിരികെ ഫീഡ് ചെയ്യുന്നു: Fetch Live Queries.

അവലംബങ്ങൾ

സാങ്കേതിക ആശയങ്ങൾ

  • Valkey - ഔദ്യോഗിക വെബ്സൈറ്റ്

  • Redis - ഔദ്യോഗിക വെബ്സൈറ്റ് (Valkey ഫോർക്ക്)

  • RediSearch - വെക്റ്റർ സെർച്ച് മൊഡ്യൂൾ

  • Cosine Similarity - വിക്കിപീഡിയ

ബന്ധപ്പെട്ട ലേഖനങ്ങൾ

  • Filter Extraction - ഫിൽട്ടറുകൾ എങ്ങനെ എക്സ്ട്രാക്റ്റ് ചെയ്യുന്നു

  • Related Search Generation - ബന്ധപ്പെട്ട തിരയലുകൾ എങ്ങനെ സൃഷ്ടിക്കുന്നു

  • Embedding Strategy - എംബെഡിംഗുകൾ എങ്ങനെ സൃഷ്ടിക്കുന്നു

  • SEO Pipeline Overview - സമ്പൂർണ്ണ പൈപ്പ്ലൈൻ ആർക്കിടെക്ചർ

  • Valkey Migration - Valkey-യിലേക്ക് ഡാറ്റ ലോഡ് ചെയ്യുന്നു

സംഗ്രഹം

ഞങ്ങളുടെ സെർച്ച് സർവീസ് ഒരു പ്രത്യേക സെർവറിൽ ഒരു സ്റ്റാൻഡലോൺ Flask ആപ്ലിക്കേഷനായി പ്രവർത്തിക്കുന്നു:

ആർക്കിടെക്ചർ:

  • സമർപ്പിത സെർവറിലെ സ്റ്റാൻഡലോൺ Flask ആപ്പ്

  • കാഷിംഗിനും വെക്റ്റർ സെർച്ചിനുമായി Valkey (Redis ഫോർക്ക്)

  • പ്രധാന വെബ് സെർവറുമായുള്ള ആശയവിനിമയത്തിനായി HTTP API

API-കൾ:

  • /api/extract_filters - ക്വെറികളിൽ നിന്ന് ഫിൽട്ടറുകൾ എക്സ്ട്രാക്റ്റ് ചെയ്യുക

  • /api/related - സമാന ക്വെറികൾ കണ്ടെത്തുക (വെക്റ്റർ സെർച്ച്)

  • /api/autocomplete - ക്വെറികൾ നിർദ്ദേശിക്കുക (പ്രിഫിക്സ് മാച്ചിംഗ്)

  • /api/popular - ജനപ്രിയ ക്വെറികൾ നേടുക

Valkey സവിശേഷതകൾ:

  • വെക്റ്റർ സെർച്ച് (RediSearch മൊഡ്യൂൾ)

  • കാഷിംഗ് (ഫ്രെയ്സ് മാപ്പിംഗുകൾക്ക് 30-ദിവസം TTL)

  • ഓട്ടോകംപ്ലീറ്റ് (സോർട്ടഡ് സെറ്റുകൾ)

  • പെർസിസ്റ്റൻസ് (AOF)

ആനുകൂല്യങ്ങൾ:

  • ഇൻഡിപെൻഡന്റ് സ്കേലിംഗ്

  • റിസോഴ്സ് ഐസൊലേഷൻ

  • ഉയർന്ന പ്രകടനം (Valkey കാഷിംഗ്)

  • തെറ്റ് സഹിഷ്ണുത (ഗ്രേസ്ഫുൾ ഡീഗ്രഡേഷൻ)

ഈ ആർക്കിടെക്ചർ പ്രധാന വെബ് സെർവറിനെ പ്രതികരണശേഷിയുള്ളതായി നിലനിർത്തിക്കൊണ്ട് വേഗതയേറിയതും സ്കേലബിൾ ആയതുമായ സെർച്ച് പ്രാപ്തമാക്കുന്നു.


← ഡോക്യുമെന്റേഷൻ സൂചികയിലേക്ക് മടങ്ങുക