একটি ভিডিও-হোস্টিং সার্ভিসের ইঞ্জিনিয়ারিং টিম তাদের SQLite FTS5 ইনডেক্সের পরিবর্তে একটি OpenSearch ক্লাস্টার ব্যবহার শুরু করেছে, যার ফলে কোনো ফলাফল না পাওয়া (zero-result) কুয়েরির হার ১২% থেকে কমিয়ে ১.৪%-এ আনা সম্ভব হয়েছে এবং সার্চ-টু-ক্লিক রেট ৯% বৃদ্ধি পেয়েছে, অথচ ল্যাটেন্সি (latency) ২৮ মিলি-সেকেন্ডের নিচে রাখা সম্ভব হয়েছে।
কেন এই পরিবর্তনটি জরুরি হয়ে পড়েছিল
SQLite-এর ফুল-টেক্সট সার্চ এক্সটেনশন (FTS5) বেশ আকর্ষণীয়: এটি অন্যান্য ডেটার সাথে একই ফাইলে থাকে, কোনো লাইসেন্সিং খরচ নেই এবং সঠিক টোকেন ম্যাচগুলোর জন্য তাৎক্ষণিকভাবে ফলাফল প্রদান করে। তবে, প্ল্যাটফর্মের লগ থেকে দেখা গেছে যে ব্যবহারকারীদের প্রায় ১২% সার্চে কোনো ফলাফলই আসছিল না। "intersteller" বা "avengrs endgame"-এর মতো বানান ভুল—যা সাধারণত মোবাইল কিবোর্ডে টাইপ করার সময় হয়ে থাকে—ছিল এর প্রধান কারণ।
ট্রাইগ্রাম (trigrams - তিন অক্ষরের খণ্ডাংশ) ব্যবহার করে একটি দ্রুত সমাধান করা হয়েছিল যা ব্ল্যাঙ্ক-সার্চের হার কমিয়ে ৭%-এ নিয়ে আসে, কিন্তু এটি দুটি সমস্যার সৃষ্টি করে। প্রথমত, ইনডেক্সের আকার মূল আকারের চেয়ে তিন গুণেরও বেশি বেড়ে যায়, যা স্টোরেজ খরচ বাড়িয়ে দেয় এবং আপডেট প্রক্রিয়াকে ধীর করে দেয়। দ্বিতীয়ত, সার্চের প্রাসঙ্গিকতা (relevance) ক্ষতিগ্রস্ত হয়; ফাজি ম্যাচিং (fuzzy matching) অপ্রাসঙ্গিক ভিডিওর একটি বিশৃঙ্খল মিশ্রণ প্রদান করছিল, যা ব্যবহারকারীদের সাহায্য করার পরিবর্তে বিভ্রান্ত করছিল।
টিমটি এই সিদ্ধান্তে উপনীত হয় যে, একটি ডেডিকেটেড সার্চ ইঞ্জিন প্রয়োজন যার নিজস্ব টাইপো-টলারেন্স (typo-tolerance) এবং উন্নত রিলেভেন্স স্কোরিং ক্ষমতা রয়েছে।
OpenSearch পাইপলাইন তৈরি করা
SQLite-কে 'সোর্স অফ ট্রুথ' হিসেবে রাখা
OpenSearch এখানে একটি ডিসপোজেবল (disposable) এবং রিড-অনলি রেপ্লিকা হিসেবে কাজ করছিল। সমস্ত ভিডিও মেটাডেটা SQLite-এই ছিল; ফলে ডেটা হারানোর ঝুঁকি ছাড়াই সার্চ ইনডেক্স পুনরায় তৈরি করা সম্ভব ছিল। যখনই OpenSearch ক্লাস্টার ডাউন হতো, অ্যাপ্লিকেশনটি স্বয়ংক্রিয়ভাবে মূল FTS5 ইঞ্জিনে ফিরে যেত।
“should” কুয়েরির মাধ্যমে স্তরীভূত প্রাসঙ্গিকতা (Layered relevance)
শুধুমাত্র ফাজি ম্যাচিং-এর ওপর নির্ভর না করে, কুয়েরিটিতে তিনটি ক্লজ (clause) যুক্ত করা হয়েছিল:
- Exact phrase match – সর্বোচ্চ বুস্ট (boost), যারা শিরোনামটি সঠিকভাবে টাইপ করেছেন তাদের জন্য।
- All terms present – মাঝারি বুস্ট, যেখানে প্রতিটি শব্দ উপস্থিত থাকে কিন্তু তা নির্দিষ্ট ক্রমে নাও থাকতে পারে।
- Fuzzy match – নিম্ন বুস্ট, যা ভুল বানানের টোকেনগুলোর জন্য একটি সেফটি নেট হিসেবে কাজ করে।
এই শ্রেণিবিন্যাসটি সঠিক কুয়েরির ক্ষেত্রে নির্ভুলতা বজায় রাখত এবং একই সাথে টাইপো বা বানান ভুলের ক্ষেত্রে একটি সহনশীল বিকল্প প্রদান করত।
ফাজি সেটিংস টিউন করা
১-এর একটি প্রিফিক্স লেন্থ (prefix length) নিশ্চিত করেছিল যে ফাজি লজিক কার্যকর হওয়ার আগে প্রতিটি শব্দের প্রথম অক্ষরটি অবশ্যই মিলতে হবে। এই নিয়মটি সার্চ দ্রুত রাখতে সাহায্য করে এবং সম্ভাব্য শব্দের সংখ্যা অত্যধিক বেড়ে যাওয়া রোধ করে যা মেমোরির ওপর চাপ সৃষ্টি করতে পারে। টিমটি টার্ম এক্সপ্যানশনের (term expansion) সর্বোচ্চ সংখ্যাও নির্দিষ্ট করে দিয়েছিল, যা অতিরিক্ত রিসোর্স ব্যবহার রোধ করার জন্য আরেকটি সুরক্ষা ব্যবস্থা হিসেবে কাজ করে।
সিনক্রোনাইজেশন কৌশল
তিনটি পরিপূরক প্রক্রিয়া OpenSearch ইনডেক্সকে SQLite-এর সাথে সামঞ্জস্যপূর্ণ রাখে:
- নতুন ডেটা সিঙ্ক করার জন্য একটি ক্রন জব (cron job)।
- নাইটলি ডিফ পাস (Nightly diff pass) – ইনক্রিমেন্টাল আপডেটের মাধ্যমে যা বাদ পড়ে গেছে এমন অমিলগুলো স্ক্যান করে।
- সাপ্তাহিক ফুল রিবিল্ড (Weekly full rebuild) – এটি একটি ইনডেক্স অ্যালিয়াসের (index alias) মাধ্যমে চলে এবং তারপর একটি মাত্র অপারেশনে অ্যালিয়াসটি পরিবর্তন করে দেয়, যা জিরো ডাউনটাইম (zero downtime) নিশ্চিত করে।
দুই সপ্তাহ পর পরিমাপযোগ্য প্রভাব
- কোনো ফলাফল না পাওয়া (zero-result) কুয়েরি ১২% থেকে কমে ১.৪%-এ নেমে এসেছে।
- সার্চ-টু-ক্লিক কনভার্সন ৯% বৃদ্ধি পেয়েছে।
- মিডিয়ান ল্যাটেন্সি (median latency) ২৮ মিলি-সেকেন্ডের নিচে ছিল, যা প্ল্যাটফর্মের ইউজার-এক্সপেরিয়েন্স টার্গেটের মধ্যেই রয়েছে।
সতর্কতা এবং পাল্টা যুক্তি
এই মাইগ্রেশনটি কোনো 'প্লাগ-অ্যান্ড-প্লে' আপগ্রেড নয়। টিমটি জোর দিয়ে বলেছে যে, প্রাইমারি ডেটাবেসকে কখনোই সার্চ ইঞ্জিন দিয়ে প্রতিস্থাপন করা উচিত নয়; ভিডিও মেটাডেটার জন্য SQLite-ই একমাত্র নির্ভরযোগ্য উৎস হিসেবে থাকবে।
মূল কথা
একটি ডেডিকেটেড সার্চ ইঞ্জিনের মাধ্যমে টাইপো টলারেন্স যুক্ত করার ফলে ব্যবহারকারীর যাত্রার একটি বড় বাধা একটি মসৃণ ও দ্রুত অভিজ্ঞতায় রূপান্তরিত হয়েছে। এই কেস স্টাডিটি দেখায় যে, একটি সুশৃঙ্খল আর্কিটেকচার—যেখানে রিলেশনাল স্টোরকে 'সোর্স অফ ট্রুথ' হিসেবে রাখা হয়, রিলেভেন্স স্তরবিন্যাস করা হয় এবং ফাজি লজিক সুরক্ষিত রাখা হয়—স্থিতিশীলতা বজায় রেখেই পরিমাপযোগ্য উন্নতি অর্জন করা সম্ভব।