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

இந்த கட்டுரை எங்கள் தேடல் சேவை எவ்வாறு தனித்து நிற்கும் பிளாஸ்க் பயன்பாடாக தனி சர்வரில் இயங்குகிறது என்பதை விளக்குகிறது, இது அதிவேக திசையன் தேடல், தற்காலிக சேமிப்பு மற்றும் தானியங்கி நிறைவுக்காக வேல்கி (ரெடிஸ் கிளை) பயன்படுத்துகிறது.

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

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

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

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

  • தானியங்கி நிறைவு: 65K வினவல்களில் முன்னொட்டு பொருத்துதல்

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

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

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

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

  • CPU போட்டி: ஒற்றுமை கணக்கீடு CPU-சுமை அதிகமுள்ளது

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

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

தீர்வு: தனித்து நிற்கும் தேடல் சேவை

நாங்கள் ஒரு அர்ப்பணிக்கப்பட்ட சர்வரில் தனி பிளாஸ்க் பயன்பாட்டை இயக்குகிறோம்:

முதன்மை வலை சர்வர்
    ↓ HTTP API அழைப்புகள்
தேடல் சேவை
    ↓ வேல்கி வினவல்கள்
வேல்கி சர்வர்

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

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

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

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

  • உயர் கிடைக்கும் தன்மை: தேடல் சேவையை மீண்டும் தொடங்குவது முதன்மை வலை சர்வரை பாதிக்காது

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

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

  • முனைப்புள்ளி: /api/extract_filters

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

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

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

பதில்:
{
  "Form Factor": "Mini PC",
  "Main Memory": "16"
}

செயலாக்கம்:

தற்காலிக சேமிப்பு: சொற்றொடர் மேப்பிங்குகள் வேல்கியில் தற்காலிகமாக சேமிக்கப்படுகின்றன (30-நாள் TTL)

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

  • முனைப்புள்ளி: /api/related

  • நோக்கம்: திசையன் தேடலை பயன்படுத்தி கருத்தியல் ரீதியாக ஒத்த வினவல்களை கண்டறிதல்

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

POST /api/related
{
  "query": "mini pc",
  "limit": 10
}

பதில்:
{
  "related": [
    {"query": "small computer", "similarity": 0.92},
    {"query": "compact desktop", "similarity": 0.89},
    {"query": "mini pc 8gb", "similarity": 0.87}
  ]
}

செயலாக்கம்:

  • all-mpnet-base-v2 ஐப் பயன்படுத்தி வினவலை உட்பொதித்தல்

  • அருகிலுள்ள அண்டை வினவல்களுக்கு வேல்கி ரெடிசர்ச் வினவுதல்

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

தற்காலிக சேமிப்பு: முடிவுகள் வேல்கியில் தற்காலிகமாக சேமிக்கப்படுகின்றன (7-நாள் TTL)

3. தானியங்கி நிறைவு API

  • முனைப்புள்ளி: /api/autocomplete

  • நோக்கம்: பயனர் தட்டச்சு செய்யும் போது வினவல்களை பரிந்துரைத்தல்

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

GET /api/autocomplete?q=mini+p&limit=5

பதில்:
{
  "suggestions": [
    "mini pc",
    "mini pc 16gb",
    "mini pc 8gb ram",
    "mini pc fanless",
    "mini pc windows 11"
  ]
}

செயலாக்கம்:

  • முன்னொட்டு பொருத்துதலுடன் வேல்கி ரெடிசர்ச் வினவுதல்

  • பிரபலத்தன்மையின்படி தரவரிசைப்படுத்துதல் (பார்வை + கிளிக் மதிப்பெண்)

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

தற்காலிக சேமிப்பு: தானியங்கி நிறைவு குறியீடு வேல்கியில் உள்ளது (தினசரி புதுப்பிக்கப்படுகிறது)

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

  • முனைப்புள்ளி: /api/popular

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

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

GET /api/popular?limit=10

பதில்:
{
  "queries": [
    "mini pc",
    "thin client",
    "industrial pc",
    "all in one pc"
  ]
}

செயலாக்கம்:

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

  • பார்வைப் போக்கு மதிப்பெண்ணின் அடிப்படையில் வரிசைப்படுத்துதல் (பார்வைகள் + கிளிக்குகள்)

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

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

வேல்கி ஒருங்கிணைப்பு

வேல்கி ஒரு ரெடிஸ் கிளையாகும், இது வழங்குவது:

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

  • தற்காலிக சேமிப்பு: வேகமான நினைவகத்தில்-கொண்ட-விசை-மதிப்பு சேமிப்பு

  • தானியங்கி நிறைவு: வரிசைப்படுத்தப்பட்ட தொகுப்புகளுடன் முன்னொட்டு பொருத்துதல்

  • நிலைத்தன்மை: நீடித்திருக்க AOF (Append-Only File)

ரெடிசர்ச் மூலம் திசையன் தேடல்

திசையன் ஒற்றுமை தேடலுக்கு வேல்கியின் ரெடிசர்ச் தொகுதியை நாங்கள் பயன்படுத்துகிறோம்:

குறியீடு உருவாக்கம்:

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 அருகிலுள்ள அண்டைகளை திருப்பி அனுப்புகிறது.

தற்காலிக சேமிப்பு உத்தி

பல்வேறு தரவு வகைகளை நாங்கள் வேல்கியில் தற்காலிகமாக சேமிக்கிறோம்:

சொற்றொடர் மேப்பிங்குகள் (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})

வரிசைப்படுத்தப்பட்ட தொகுப்புகளுடன் தானியங்கி நிறைவு

தானியங்கி நிறைவுக்கு வேல்கி வரிசைப்படுத்தப்பட்ட தொகுப்புகளை நாங்கள் பயன்படுத்துகிறோம்:

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

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 = {}  # காலி வடிகட்டிகளுக்கு கீழிறக்கம்

தேடல் சேவை செயலிழந்தாலும் முதன்மை வலை சர்வர் தொடர்ந்து செயல்படுவதை இது உறுதி செய்கிறது. ```

பிணைய உள்ளமைவு

அனைத்து சர்வர்களும் ஒரு தனியார் பிணையத்தில் உள்ளன:

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

  • தேடல் சேவை: வேல்கியை அணுக முடியும்

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

தேடல் சேவை அல்லது வேல்கிக்கு வெளிப்புற அணுகல் இல்லை.

SEO குழாய்வழியுடன் ஒருங்கிணைப்பு

தேடல் சேவை SEO குழாய்வழியுடன் ஒருங்கிணைக்கப்படுகிறது:

படி 11: வேல்கிக்கு இடமாற்றம்

SEO குழாய்வழி தரவை வேல்கியில் ஏற்றுகிறது:

```python

வினவல் உட்பொதிவுகளை ஏற்றுதல்

for query, embedding in zip(queries, embeddings): client.hset(f"query:{query_hash}", mapping={ "query": query, "embedding": embedding.tobytes(), "score": score })