സെർച്ച് സർവീസ് ആർക്കിടെക്ചർ: വാൽക്കീയുമായുള്ള സ്റ്റാൻഡലോൺ 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 കാഷിംഗ്)
-
തെറ്റ് സഹിഷ്ണുത (ഗ്രേസ്ഫുൾ ഡീഗ്രഡേഷൻ)
ഈ ആർക്കിടെക്ചർ പ്രധാന വെബ് സെർവറിനെ പ്രതികരണശേഷിയുള്ളതായി നിലനിർത്തിക്കൊണ്ട് വേഗതയേറിയതും സ്കേലബിൾ ആയതുമായ സെർച്ച് പ്രാപ്തമാക്കുന്നു.