সার্চ সার্ভিস আর্কিটেকচার: ভ্যালকির সাথে স্ট্যান্ডঅ্যালোন ফ্লাস্ক অ্যাপ্লিকেশন
এই নিবন্ধটি ব্যাখ্যা করে যে কীভাবে আমাদের সার্চ সার্ভিস একটি পৃথক সার্ভারে একটি স্ট্যান্ডঅ্যালোন ফ্লাস্ক অ্যাপ্লিকেশন হিসাবে চলে, যা উচ্চ-কার্যক্ষমতা ভেক্টর সার্চ, ক্যাশিং এবং অটোকমপ্লিটের জন্য ভ্যালকি (রেডিস ফর্ক) ব্যবহার করে।
সমস্যা: সার্চ কর্মক্ষমতা এবং স্কেলেবিলিটি
সার্চ অপারেশনগুলি গণনামূলকভাবে ব্যয়বহুল:
-
ফিল্টার নিষ্কাশন: প্রতিটি ক্যোয়ারীর বিরুদ্ধে ২,৫০০+ বাক্যাংশ মেলানো
-
সম্পর্কিত সার্চ: ৬৫ হাজার ক্যোয়ারী জুড়ে সাদৃশ্য গণনা করা
-
অটোকমপ্লিট: ৬৫ হাজার ক্যোয়ারীতে প্রিফিক্স ম্যাচিং
-
পণ্য ফিল্টারিং: একাধিক মানদণ্ড দ্বারা ৫ হাজার+ পণ্য ফিল্টার করা
এই অপারেশনগুলি মূল ওয়েব সার্ভারে চালালে ঘটে:
-
ধীর পৃষ্ঠা লোড: সার্চ অন্যান্য অনুরোধগুলিকে ব্লক করে
-
মেমরি চাপ: এমবেডিংগুলি একটি বিশাল মেমরি ফুটপ্রিন্টের জন্য দায়ী
-
CPU প্রতিযোগিতা: সাদৃশ্য গণনা CPU-নিবিড়
-
স্কেলিং কঠিনতা: সার্চকে স্বাধীনভাবে স্কেল করা যায় না
আমাদের একটি নিবেদিত সার্চ সার্ভিস প্রয়োজন যা স্বাধীনভাবে স্কেল করতে পারে।
সমাধান: স্ট্যান্ডঅ্যালোন সার্চ সার্ভিস
আমরা একটি নিবেদিত সার্ভারে একটি পৃথক ফ্লাস্ক অ্যাপ্লিকেশন চালাই:
মূল ওয়েব সার্ভার
↓ HTTP API কল
সার্চ সার্ভিস
↓ ভ্যালকি ক্যোয়ারী
ভ্যালকি সার্ভার
এই আর্কিটেকচার প্রদান করে:
-
স্বাধীন স্কেলিং: মূল ওয়েব সার্ভারকে প্রভাবিত না করে সার্চ সার্ভিস স্কেল করুন
-
রিসোর্স বিচ্ছিন্নতা: সার্চ অপারেশন মূল ওয়েব সার্ভারকে প্রভাবিত করে না
-
ক্যাশিং: ভ্যালকি পুনরাবৃত্ত ক্যোয়ারীর জন্য ফলাফল ক্যাশ করে দ্রুততা দেয়
-
উচ্চ প্রাপ্যতা: সার্চ সার্ভিস মূল ওয়েব সার্ভারকে প্রভাবিত না করে পুনরায় শুরু করতে পারে
সার্চ সার্ভিস কম্পোনেন্টস
১. ফিল্টার নিষ্কাশন API
-
এন্ডপয়েন্ট:
/api/extract_filters -
উদ্দেশ্য: প্রাকৃতিক ভাষার ক্যোয়ারী থেকে কাঠামোবদ্ধ ফিল্টার নিষ্কাশন
-
উদাহরণ:
GET /api/extract_filters?q=mini+pc+16gb+ram
প্রতিক্রিয়া:
{
"Form Factor": "Mini PC",
"Main Memory": "16"
}
বাস্তবায়ন:
-
ভ্যালকি বা JSON থেকে বাক্যাংশ-থেকে-ফিল্টার ম্যাপিংস লোড করুন
-
শব্দ সীমানা রেগেক্স ব্যবহার করে বাক্যাংশ মেলান
-
কাঠামোবদ্ধ ফিল্টার ফেরত দিন
ক্যাশিং: বাক্যাংশ ম্যাপিংস ভ্যালকিতে ক্যাশ করা (৩০-দিন 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: লাইভ ক্যোয়ারী আনুন-এ ফিরে খাওয়ায়।
তথ্যসূত্র
প্রযুক্তিগত ধারণা
-
ভ্যালকি - অফিসিয়াল ওয়েবসাইট
-
রেডিস - অফিসিয়াল ওয়েবসাইট (ভ্যালকি ফর্ক)
-
RediSearch - ভেক্টর সার্চ মডিউল
-
কোসাইন সাদৃশ্য - উইকিপিডিয়া
সম্পর্কিত নিবন্ধ
-
ফিল্টার নিষ্কাশন - কীভাবে ফিল্টার নিষ্কাশন করা হয়
-
সম্পর্কিত সার্চ জেনারেশন - কীভাবে সম্পর্কিত সার্চ তৈরি করা হয়
-
এমবেডিং কৌশল - কীভাবে এমবেডিং তৈরি করা হয়
-
SEO পাইপলাইন ওভারভিউ - সম্পূর্ণ পাইপলাইন আর্কিটেকচার
-
ভ্যালকি মাইগ্রেশন - ভ্যালকিতে ডেটা লোড করা
সারসংক্ষেপ
আমাদের সার্চ সার্ভিস একটি পৃথক সার্ভারে একটি স্ট্যান্ডঅ্যালোন ফ্লাস্ক অ্যাপ্লিকেশন হিসাবে চলে:
আর্কিটেকচার:
-
নিবেদিত সার্ভারে স্ট্যান্ডঅ্যালোন ফ্লাস্ক অ্যাপ
-
ক্যাশিং এবং ভেক্টর সার্চের জন্য ভ্যালকি (রেডিস ফর্ক)
-
মূল ওয়েব সার্ভারের সাথে যোগাযোগের জন্য HTTP API
APIs:
-
/api/extract_filters- ক্যোয়ারী থেকে ফিল্টার নিষ্কাশন -
/api/related- অনুরূপ ক্যোয়ারী খুঁজুন (ভেক্টর সার্চ) -
/api/autocomplete- ক্যোয়ারী পরামর্শ দিন (প্রিফিক্স ম্যাচিং) -
/api/popular- জনপ্রিয় ক্যোয়ারী পান
ভ্যালকি বৈশিষ্ট্য:
-
ভেক্টর সার্চ (RediSearch মডিউল)
-
ক্যাশিং (বাক্যাংশ ম্যাপিংসের জন্য ৩০-দিন TTL)
-
অটোকমপ্লিট (সাজানো সেট)
-
স্থায়িত্ব (AOF)
সুবিধা:
-
স্বাধীন স্কেলিং
-
রিসোর্স বিচ্ছিন্নতা
-
উচ্চ কর্মক্ষমতা (ভ্যালকি ক্যাশিং)
-
ফল্ট টলারেন্স (মার্জিত অবনতি)
এই আর্কিটেকচার মূল ওয়েব সার্ভারকে প্রতিক্রিয়াশীল রাখার সময় দ্রুত, স্কেলযোগ্য সার্চ সক্ষম করে।
**[←