সার্চ সার্ভিস আর্কিটেকচার: ভ্যালকির সাথে স্ট্যান্ডঅ্যালোন ফ্লাস্ক অ্যাপ্লিকেশন

এই নিবন্ধটি ব্যাখ্যা করে যে কীভাবে আমাদের সার্চ সার্ভিস একটি পৃথক সার্ভারে একটি স্ট্যান্ডঅ্যালোন ফ্লাস্ক অ্যাপ্লিকেশন হিসাবে চলে, যা উচ্চ-কার্যক্ষমতা ভেক্টর সার্চ, ক্যাশিং এবং অটোকমপ্লিটের জন্য ভ্যালকি (রেডিস ফর্ক) ব্যবহার করে।

সমস্যা: সার্চ কর্মক্ষমতা এবং স্কেলেবিলিটি

সার্চ অপারেশনগুলি গণনামূলকভাবে ব্যয়বহুল:

  • ফিল্টার নিষ্কাশন: প্রতিটি ক্যোয়ারীর বিরুদ্ধে ২,৫০০+ বাক্যাংশ মেলানো

  • সম্পর্কিত সার্চ: ৬৫ হাজার ক্যোয়ারী জুড়ে সাদৃশ্য গণনা করা

  • অটোকমপ্লিট: ৬৫ হাজার ক্যোয়ারীতে প্রিফিক্স ম্যাচিং

  • পণ্য ফিল্টারিং: একাধিক মানদণ্ড দ্বারা ৫ হাজার+ পণ্য ফিল্টার করা

এই অপারেশনগুলি মূল ওয়েব সার্ভারে চালালে ঘটে:

  • ধীর পৃষ্ঠা লোড: সার্চ অন্যান্য অনুরোধগুলিকে ব্লক করে

  • মেমরি চাপ: এমবেডিংগুলি একটি বিশাল মেমরি ফুটপ্রিন্টের জন্য দায়ী

  • CPU প্রতিযোগিতা: সাদৃশ্য গণনা CPU-নিবিড়

  • স্কেলিং কঠিনতা: সার্চকে স্বাধীনভাবে স্কেল করা যায় না

আমাদের একটি নিবেদিত সার্চ সার্ভিস প্রয়োজন যা স্বাধীনভাবে স্কেল করতে পারে।

সমাধান: স্ট্যান্ডঅ্যালোন সার্চ সার্ভিস

আমরা একটি নিবেদিত সার্ভারে একটি পৃথক ফ্লাস্ক অ্যাপ্লিকেশন চালাই:

মূল ওয়েব সার্ভার
    ↓ HTTP API কল
সার্চ সার্ভিস
    ↓ ভ্যালকি ক্যোয়ারী
ভ্যালকি সার্ভার

এই আর্কিটেকচার প্রদান করে:

  • স্বাধীন স্কেলিং: মূল ওয়েব সার্ভারকে প্রভাবিত না করে সার্চ সার্ভিস স্কেল করুন

  • রিসোর্স বিচ্ছিন্নতা: সার্চ অপারেশন মূল ওয়েব সার্ভারকে প্রভাবিত করে না

  • ক্যাশিং: ভ্যালকি পুনরাবৃত্ত ক্যোয়ারীর জন্য ফলাফল ক্যাশ করে দ্রুততা দেয়

  • উচ্চ প্রাপ্যতা: সার্চ সার্ভিস মূল ওয়েব সার্ভারকে প্রভাবিত না করে পুনরায় শুরু করতে পারে

সার্চ সার্ভিস কম্পোনেন্টস

১. ফিল্টার নিষ্কাশন API

  • এন্ডপয়েন্ট: /api/extract_filters

  • উদ্দেশ্য: প্রাকৃতিক ভাষার ক্যোয়ারী থেকে কাঠামোবদ্ধ ফিল্টার নিষ্কাশন

  • উদাহরণ:

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

প্রতিক্রিয়া:
{
  "Form Factor": "Mini PC",
  "Main Memory": "16"
}

বাস্তবায়ন:

ক্যাশিং: বাক্যাংশ ম্যাপিংস ভ্যালকিতে ক্যাশ করা (৩০-দিন TTL)

২. সম্পর্কিত সার্চ 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 ব্যবহার করে ক্যোয়ারী এম্বেড করুন

  • নিকটতম প্রতিবেশীদের জন্য ভ্যালকি RediSearch ক্যোয়ারী করুন

  • সাদৃশ্য অনুসারে সাজানো শীর্ষ N ফলাফল ফেরত দিন

ক্যাশিং: ফলাফল ভ্যালকিতে ক্যাশ করা (৭-দিন TTL)

৩. অটোকমপ্লিট 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"
  ]
}

বাস্তবায়ন:

  • প্রিফিক্স ম্যাচিং সহ ভ্যালকি RediSearch ক্যোয়ারী করুন

  • জনপ্রিয়তা দ্বারা র্যাঙ্ক করুন (ইমপ্রেশন + ক্লিক স্কোর)

  • শীর্ষ N পরামর্শ ফেরত দিন

ক্যাশিং: অটোকমপ্লিট সূচক ভ্যালকিতে (দৈনিক আপডেট করা)

৪. জনপ্রিয় ক্যোয়ারী API

  • এন্ডপয়েন্ট: /api/popular

  • উদ্দেশ্য: সবচেয়ে জনপ্রিয় ক্যোয়ারী পান

  • উদাহরণ:

GET /api/popular?limit=10

প্রতিক্রিয়া:
{
  "queries": [
    "mini pc",
    "thin client",
    "industrial pc",
    "all in one pc"
  ]
}

বাস্তবায়ন:

  • ভ্যালকি বা JSON থেকে ক্যোয়ারী লোড করুন

  • ট্রাফিক স্কোর দ্বারা সাজান (ইমপ্রেশন + ক্লিক)

  • শীর্ষ N ক্যোয়ারী ফেরত দিন

ক্যাশিং: জনপ্রিয় ক্যোয়ারী ভ্যালকিতে ক্যাশ করা (৩০-দিন TTL)

ভ্যালকি ইন্টিগ্রেশন

ভ্যালকি হল একটি রেডিস ফর্ক যা প্রদান করে:

  • ভেক্টর সার্চ: সাদৃশ্য সার্চের জন্য RediSearch মডিউল

  • ক্যাশিং: দ্রুত ইন-মেমরি কী-ভ্যালু স্টোর

  • অটোকমপ্লিট: সাজানো সেট সহ প্রিফিক্স ম্যাচিং

  • স্থায়িত্ব: স্থায়িত্বের জন্য AOF (অ্যাপেন্ড-অনলি ফাইল)

RediSearch সহ ভেক্টর সার্চ

আমরা ভেক্টর সাদৃশ্য সার্চের জন্য ভ্যালকির 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()}
)

এটি কোসাইন সাদৃশ্য দ্বারা ১০টি নিকটতম প্রতিবেশী ফেরত দেয়।

ক্যাশিং কৌশল

আমরা ভ্যালকিতে একাধিক ডেটা টাইপ ক্যাশ করি:

বাক্যাংশ ম্যাপিংস (৩০-দিন TTL):

client.setex(
    "seo:phrase_mappings",
    30 * 24 * 3600,
    json.dumps(phrase_mappings)
)

সম্পর্কিত সার্চ (৭-দিন TTL):

cache_key = f"related:{query_hash}"
client.setex(cache_key, 7 * 24 * 3600, json.dumps(results))

জনপ্রিয় ক্যোয়ারী (৩০-দিন 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" দিয়ে শুরু হওয়া শীর্ষ ১০টি ক্যোয়ারী ফেরত দেয়, স্কোর দ্বারা সাজানো।

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 পাইপলাইনের সাথে সংহত হয়:

### ধাপ ১১: ভ্যালকিতে স্থানান্তর

SEO পাইপলাইন ডেটা ভ্যালকিতে লোড করে:

```python
# ক্যোয়ারী এমবেডিং লোড করুন
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([...])

বিস্তারিত জানতে ভ্যালকি মাইগ্রেশন দেখুন।

ক্যোয়ারী লগিং

সার্চ সার্ভিস 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")

এই লগগুলি ধাপ ১d: লাইভ ক্যোয়ারী আনুন-এ ফিরে খাওয়ায়।

তথ্যসূত্র

প্রযুক্তিগত ধারণা

সম্পর্কিত নিবন্ধ

সারসংক্ষেপ

আমাদের সার্চ সার্ভিস একটি পৃথক সার্ভারে একটি স্ট্যান্ডঅ্যালোন ফ্লাস্ক অ্যাপ্লিকেশন হিসাবে চলে:

আর্কিটেকচার:

  • নিবেদিত সার্ভারে স্ট্যান্ডঅ্যালোন ফ্লাস্ক অ্যাপ

  • ক্যাশিং এবং ভেক্টর সার্চের জন্য ভ্যালকি (রেডিস ফর্ক)

  • মূল ওয়েব সার্ভারের সাথে যোগাযোগের জন্য HTTP API

APIs:

  • /api/extract_filters - ক্যোয়ারী থেকে ফিল্টার নিষ্কাশন

  • /api/related - অনুরূপ ক্যোয়ারী খুঁজুন (ভেক্টর সার্চ)

  • /api/autocomplete - ক্যোয়ারী পরামর্শ দিন (প্রিফিক্স ম্যাচিং)

  • /api/popular - জনপ্রিয় ক্যোয়ারী পান

ভ্যালকি বৈশিষ্ট্য:

  • ভেক্টর সার্চ (RediSearch মডিউল)

  • ক্যাশিং (বাক্যাংশ ম্যাপিংসের জন্য ৩০-দিন TTL)

  • অটোকমপ্লিট (সাজানো সেট)

  • স্থায়িত্ব (AOF)

সুবিধা:

  • স্বাধীন স্কেলিং

  • রিসোর্স বিচ্ছিন্নতা

  • উচ্চ কর্মক্ষমতা (ভ্যালকি ক্যাশিং)

  • ফল্ট টলারেন্স (মার্জিত অবনতি)

এই আর্কিটেকচার মূল ওয়েব সার্ভারকে প্রতিক্রিয়াশীল রাখার সময় দ্রুত, স্কেলযোগ্য সার্চ সক্ষম করে।


**[←