தேடல் சேவை கட்டமைப்பு: 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"
}
செயல்படுத்துதல்:
-
Valkey அல்லது JSON இலிருந்து சொற்றொடர்-வடிகட்டி மேப்பிங்குகள் ஐ ஏற்றவும்
-
சொல் எல்லை regex பயன்படுத்தி சொற்றொடர்களை பொருத்தவும்
-
கட்டமைக்கப்பட்ட வடிகட்டிகளை திருப்பி அனுப்பவும்
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 - விக்கிபீடியா
தொடர்புடைய கட்டுரைகள்
-
வடிகட்டி பிரித்தெடுத்தல் - வடிகட்டிகள் எவ்வாறு பிரித்தெடுக்கப்படுகின்றன
-
தொடர்புடைய தேடல் உருவாக்கம் - தொடர்புடைய தேடல்கள் எவ்வாறு உருவாக்கப்படுகின்றன
-
Embedding உத்தி - Embeddings எவ்வாறு உருவாக்கப்படுகின்றன
-
SEO Pipeline கண்ணோட்டம் - முழுமையான pipeline கட்டமைப்பு
-
Valkey Migration - Valkey இல் தரவை ஏற்றுதல்
சுருக்கம்
எங்கள் தேடல் சேவை ஒரு தனித்த சேவையகத்தில் தனித்த 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)
இந்த கட்டமைப்பு முக்கிய வலை சேவையகத்தை பதிலளிக்கக்கூடியதாக வைத்திருக்கும்போது வேகமான, அளவிடக்கூடிய தேடலை செயல்படுத்துகிறது.