தேடல் சேவை கட்டமைப்பு: Valkey உடன் தனித்த Flask பயன்பாடு

இந்த கட்டுரை, எங்கள் தேடல் சேவையானது Valkey (Redis fork) ஐ உயர்-செயல்திறன் வெக்டர் தேடல், caching மற்றும் autocomplete க்காகப் பயன்படுத்தி, தனித்த சேவையகத்தில் ஒரு தனித்த Flask பயன்பாடாக எவ்வாறு இயங்குகிறது என்பதை விளக்குகிறது.

பிரச்சனை: தேடல் செயல்திறன் மற்றும் அளவிடுதிறன்

தேடல் செயல்பாடுகள் கணக்கீட்டு ரீதியாக விலை உயர்ந்தவை:

  • வடிகட்டி பிரித்தெடுத்தல்: ஒவ்வொரு கேள்விக்கும் எதிராக 2,500+ சொற்றொடர்களை பொருத்தவும்

  • தொடர்புடைய தேடல்கள்: 65K கேள்விகளுக்கு இடையே ஒற்றுமையை கணக்கிடவும்

  • Autocomplete: 65K கேள்விகளில் முன்னொட்டு பொருத்தம்

  • தயாரிப்பு வடிகட்டுதல்: பல அளவுகோல்களால் 5K+ தயாரிப்புகளை வடிகட்டவும்

முக்கிய வலை சேவையகத்தில் இந்த செயல்பாடுகளை இயக்குவது பின்வருவனவற்றை ஏற்படுத்துகிறது:

  • மெதுவான பக்க ஏற்றங்கள்: தேடல் மற்ற கோரிக்கைகளை தடுக்கிறது

  • நினைவக அழுத்தம்: Embeddings மிகப்பெரிய நினைவக தடம் கொண்டுள்ளன

  • CPU போட்டி: ஒற்றுமை கணக்கீடு CPU-தீவிரமானது

  • அளவிடுதிறன் சிரமம்: தேடலை சுயாதீனமாக அளவிட முடியாது

சுயாதீனமாக அளவிடக்கூடிய ஒரு பிரத்யேக தேடல் சேவை நமக்குத் தேவை.

தீர்வு: தனித்த தேடல் சேவை

ஒரு பிரத்யேக சேவையகத்தில் தனித்த Flask பயன்பாட்டை இயக்குகிறோம்:

Main Web Server
    ↓ HTTP API calls
Search Service
    ↓ Valkey queries
Valkey Server

இந்த கட்டமைப்பு வழங்குகிறது:

  • சுயாதீன அளவிடுதிறன்: முக்கிய வலை சேவையகத்தை பாதிக்காமல் தேடல் சேவையை அளவிடவும்

  • வள தனிமைப்படுத்தல்: தேடல் செயல்பாடுகள் முக்கிய வலை சேவையகத்தை பாதிக்காது

  • Caching: விரைவான மீண்டும் மீண்டும் கேள்விகளுக்கு Valkey முடிவுகளை cache செய்கிறது

  • அதிக கிடைக்கும் தன்மை: முக்கிய வலை சேவையகத்தை பாதிக்காமல் தேடல் சேவையை மறுதொடக்கம் செய்யலாம்

தேடல் சேவை கூறுகள்

1. வடிகட்டி பிரித்தெடுத்தல் API

  • Endpoint: /api/extract_filters

  • நோக்கம்: இயற்கை மொழி கேள்விகளிலிருந்து கட்டமைக்கப்பட்ட வடிகட்டிகளை பிரித்தெடுக்க

  • எடுத்துக்காட்டு:

GET /api/extract_filters?q=mini+pc+16gb+ram

Response:
{
  "Form Factor": "Mini PC",
  "Main Memory": "16"
}

செயல்படுத்துதல்:

Caching: Phrase mappings Valkey இல் cache செய்யப்படுகின்றன (30-நாள் TTL)

2. தொடர்புடைய தேடல்கள் API

  • Endpoint: /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 பயன்படுத்தி கேள்வியை embed செய்யவும்

  • அருகிலுள்ள அண்டை வீடுகளுக்கு Valkey RediSearch ஐ query செய்யவும்

  • ஒற்றுமையால் வரிசைப்படுத்தப்பட்ட முதல் N முடிவுகளை திருப்பி அனுப்பவும்

Caching: முடிவுகள் Valkey இல் cache செய்யப்படுகின்றன (7-நாள் TTL)

3. Autocomplete API

  • Endpoint: /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 ஐ query செய்யவும்

  • புகழ் (impression + click score) மூலம் வரிசைப்படுத்தவும்

  • முதல் N பரிந்துரைகளை திருப்பி அனுப்பவும்

Caching: Autocomplete index Valkey இல் (தினமும் புதுப்பிக்கப்படுகிறது)

4. பிரபலமான கேள்விகள் API

  • Endpoint: /api/popular

  • நோக்கம்: மிகவும் பிரபலமான கேள்விகளைப் பெற

  • எடுத்துக்காட்டு:

GET /api/popular?limit=10

Response:
{
  "queries": [
    "mini pc",
    "thin client",
    "industrial pc",
    "all in one pc"
  ]
}

செயல்படுத்துதல்:

  • Valkey அல்லது JSON இலிருந்து கேள்விகளை ஏற்றவும்

  • போக்குவரத்து மதிப்பெண் (impressions + clicks) மூலம் வரிசைப்படுத்தவும்

  • முதல் N கேள்விகளை திருப்பி அனுப்பவும்

Caching: பிரபலமான கேள்விகள் Valkey இல் cache செய்யப்படுகின்றன (30-நாள் TTL)

Valkey ஒருங்கிணைப்பு

Valkey என்பது Redis fork ஆகும், இது வழங்குகிறது:

  • வெக்டர் தேடல்: ஒற்றுமை தேடலுக்கான RediSearch தொகுதி

  • Caching: வேகமான in-memory key-value store

  • Autocomplete: sorted sets உடன் முன்னொட்டு பொருத்தம்

  • Persistence: நீடித்துழைப்புக்கான 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()}
)

இது cosine ஒற்றுமையால் 10 அருகிலுள்ள அண்டை வீடுகளைத் திருப்பி அனுப்புகிறது.

Caching உத்தி

Valkey இல் பல தரவு வகைகளை cache செய்கிறோம்:

Phrase Mappings (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)
)

Autocomplete Index (தினமும் புதுப்பிக்கப்படுகிறது):

for query, score in queries:
    client.zadd("autocomplete:mini", {query: score})

Sorted Sets உடன் Autocomplete

Autocomplete க்கு Valkey sorted sets ஐப் பயன்படுத்துகிறோம்:

குறியீட்டு அமைப்பு:

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"]

Autocomplete

response = requests.get(
    "SEARCH_SERVICE_URL/api/autocomplete",
    params={"q": "mini p", "limit": 5},
    timeout=1
)
suggestions = response.json()["suggestions"]

பிழை கையாளுதல் மற்றும் Fallbacks

முக்கிய வலை சேவையகம் தேடல் சேவை தோல்விகளை சுமூகமாக கையாளுகிறது:

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 Pipeline உடன் ஒருங்கிணைப்பு

தேடல் சேவை SEO pipeline உடன் ஒருங்கிணைக்கிறது:

படி 11: Valkey க்கு Migrate செய்யவும்

SEO pipeline Valkey இல் தரவை ஏற்றுகிறது:

# 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 Migration பார்க்கவும்.

கேள்வி பதிவு (Query Logging)

தேடல் சேவை SEO pipeline க்காக கேள்விகளை பதிவு செய்கிறது:

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 fork)

  • RediSearch - வெக்டர் தேடல் தொகுதி

  • Cosine Similarity - விக்கிபீடியா

தொடர்புடைய கட்டுரைகள்

சுருக்கம்

எங்கள் தேடல் சேவை ஒரு தனித்த சேவையகத்தில் தனித்த Flask பயன்பாடாக இயங்குகிறது:

கட்டமைப்பு:

  • பிரத்யேக சேவையகத்தில் தனித்த Flask பயன்பாடு

  • Caching மற்றும் வெக்டர் தேடலுக்கான Valkey (Redis fork)

  • முக்கிய வலை சேவையகத்துடன் தொடர்புக்கான HTTP API

APIs:

  • /api/extract_filters - கேள்விகளிலிருந்து வடிகட்டிகளை பிரித்தெடுக்க

  • /api/related - ஒத்த கேள்விகளைக் கண்டறிய (வெக்டர் தேடல்)

  • /api/autocomplete - கேள்விகளை பரிந்துரைக்க (முன்னொட்டு பொருத்தம்)

  • /api/popular - பிரபலமான கேள்விகளைப் பெற

Valkey அம்சங்கள்:

  • வெக்டர் தேடல் (RediSearch தொகுதி)

  • Caching (phrase mappings க்கு 30-நாள் TTL)

  • Autocomplete (sorted sets)

  • Persistence (AOF)

நன்மைகள்:

  • சுயாதீன அளவிடுதிறன்

  • வள தனிமைப்படுத்தல்

  • உயர் செயல்திறன் (Valkey caching)

  • பிழை சகிப்புத்தன்மை (graceful degradation)

இந்த கட்டமைப்பு முக்கிய வலை சேவையகத்தை பதிலளிக்கக்கூடியதாக வைத்திருக்கும்போது வேகமான, அளவிடக்கூடிய தேடலை செயல்படுத்துகிறது.


← ஆவண குறியீட்டிற்கு திரும்பு