একটি ডেভেলপার টিম OpenSearch-কে SQLite FTS5-এর সাথে যুক্ত করেছে এবং ভিডিও সার্চের 'জিরো-রেজাল্ট' (ফলাফলহীন সার্চ) এর হার ১১.৪ শতাংশ থেকে কমিয়ে ২.১ শতাংশে নিয়ে এসেছে, আর ল্যাটেন্সি (latency) ২০ মিলিসেকেন্ডের নিচে বজায় রেখেছে। এখন ব্যবহারকারীরা “blackpink jenny solo stag” টাইপ করলে একটি খালি তালিকার পরিবর্তে সঠিক “BLACKPINK Jennie SOLO stage” দেখতে পান।

কেন এই পরিবর্তনের প্রয়োজন ছিল

একটি ভিডিও-হোস্টিং প্ল্যাটফর্মের সার্চ লগ থেকে একটি পুনরাবৃত্তিমূলক সমস্যা ধরা পড়ে: ল্যাটিন-স্ক্রিপ্টের (Latin-script) টাইটেলে একটি মাত্র বানান ভুল সমস্ত ম্যাচকে বাতিল করে দিচ্ছিল। SQLite-এর FTS5 এক্সটেনশনটি চাইনিজ, জাপানিজ এবং কোরিয়ান (CJK) টেক্সটে সাবস্ট্রিং ম্যাচ করার ক্ষমতার জন্য সমাদৃত হলেও, এটি 'ফাজি ম্যাচিং' (fuzzy matching) করতে পারে না। নাম বা গানের শিরোনামে একটি ভুল অক্ষর পুরো কুয়েরিটিকে অকেজো করে দেয়।

বিদ্যমান পাইপলাইনটি SQLite-কে একমাত্র ইনডেক্স হিসেবে ব্যবহার করত। এটি CJK কুয়েরিগুলো ভালোভাবে সামলাতে পারলেও ল্যাটিন-স্ক্রিপ্টের টাইপো বা বানান ভুলের জন্য কোনো সুরক্ষা প্রদান করত না। তাই টিমটি এমন একটি পরিপূরক সার্চ ইঞ্জিন খুঁজছিল যা প্রমাণিত FTS5 লেয়ারটিকে বাদ না দিয়েই টাইপো সহনশীলতা (typo tolerance) প্রদান করতে পারে।

কীভাবে OpenSearch যুক্ত করা হলো

OpenSearch ফ্রন্ট-লাইন সার্চ সার্ভিস হিসেবে কাজ করে; আর SQLite মূল তথ্যের উৎস (source of truth) হিসেবে থাকে। দুটি সিস্টেম সমান্তরালভাবে চলে: প্রথমে OpenSearch ব্যবহারকারীর কুয়েরি গ্রহণ করে এবং যদি এটি যথেষ্ট দ্রুত সাড়া দেয়, তবে এর ফলাফল দেখানো হয়। যদি OpenSearch টাইম-আউট হয় বা কোনো ত্রুটি দেখা দেয়, তবে রিকোয়েস্টটি SQLite FTS5 ইনডেক্সে চলে যায়। এই "ফেইল-সেফ" (fail-safe) ডিজাইনটি নিশ্চিত করে যে নেটওয়ার্কের কোনো সমস্যার কারণে সার্চ বার যেন কখনো খালি না থাকে।

মাল্টি-ফিল্ড ম্যাপিং (Multi-field mapping)

OpenSearch-এ প্রতিটি ভিডিও শিরোনাম তিনটি উপায়ে ইনডেক্স করা হয়:

  • title.std – ASCII folding সহ একটি স্ট্যান্ডার্ড অ্যানালাইজার দ্বারা প্রসেস করা হয়। এটি অ্যাকসেন্টেড ক্যারেক্টারগুলোকে নরমালাইজ করে এবং বেশিরভাগ ল্যাটিন-স্ক্রিপ্টের টাইপো সামলায়।
  • title.cjk – একটি CJK অ্যানালাইজার দ্বারা প্রসেস করা হয় যা বিগ্ৰাম (bigrams - দুটি অক্ষরের টোকেন) তৈরি করে। এটি এশীয় স্ক্রিপ্টের জন্য FTS5 যে সাবস্ট্রিং-ম্যাচিং ক্ষমতা প্রদান করে, তা বজায় রাখে।
  • title.keyword – সঠিক ম্যাচ (exact-match) খোঁজা এবং সর্টিংয়ের জন্য অপরিবর্তিত অবস্থায় সংরক্ষিত থাকে।

আলাদা ফিল্ড থাকার ফলে টোকেনাইজেশন কৌশলগুলো মিশ্রিত না করেই কুয়েরি প্রতিটি স্ক্রিপ্টের জন্য সঠিক অ্যানালাইসিস প্রয়োগ করতে পারে।

বুস্ট টিয়ার (Boost tiers)

একটি একক মনোলিথিক কুয়েরির পরিবর্তে, টিমটি একটি টিয়ারড (tiered) কুয়েরি তৈরি করেছে যা স্বয়ংক্রিয়ভাবে ফলাফলগুলোকে র‍্যাঙ্ক করে:

  1. title.keyword-এ সঠিক ফ্রেজ ম্যাচ (Exact phrase matches) সবচেয়ে বেশি বুস্ট পায়, যা নিশ্চিত করে যে নিখুঁত ম্যাচগুলো তালিকার শীর্ষে থাকবে।
  2. title.cjk-এ CJK বিগ্ৰাম ম্যাচ (CJK bigram matches) মাঝারি বুস্ট পায়, যা এশীয় ভাষার সার্চের মান বজায় রাখে।
  3. title.std-এ ফাজি ল্যাটিন ম্যাচ (Fuzzy Latin matches) কম বুস্ট পায়, যাতে সঠিক ম্যাচগুলোকে ছাপিয়ে না গিয়েও টাইপো-সহনশীল ফলাফলগুলো প্রদর্শিত হতে পারে।

এই টিয়ারড পদ্ধতি টিউনিং করা সহজ করে তোলে: একটি বুস্ট ভ্যালু পরিবর্তন করলে পুরো একটি শ্রেণির ম্যাচের আপেক্ষিক গুরুত্ব পরিবর্তিত হয়ে যায়।

স্মার্ট ফাজিনেস (Smart fuzziness)

ফাজিনেস (Fuzziness)—যা সীমিত সংখ্যক ক্যারেক্টার এডিট করার অনুমতি দেয়—শুধুমাত্র ল্যাটিন ফিল্ডের ক্ষেত্রে প্রযোজ্য। টিমটি title.cjk-এর জন্য ফাজিনেস নিষ্ক্রিয় করে দিয়েছে কারণ CJK-তে একটি মাত্র অক্ষরের পরিবর্তন প্রায়শই সম্পূর্ণ অর্থ বদলে দেয়। ল্যাটিন টেক্সটের জন্য কুয়েরিটি OpenSearch-এর AUTO ফাজিনেস সেটিংস ব্যবহার করে, যা শব্দের দৈর্ঘ্যের ওপর ভিত্তি করে অনুমোদিত এডিট ডিস্টেন্স (edit distance) নির্ধারণ করে এবং সহনশীলতা ও প্রাসঙ্গিকতার মধ্যে ভারসাম্য বজায় রাখে।

পারফরম্যান্স এবং ফলব্যাক লজিক (Performance and fallback logic)

সার্চ রুটিনটি OpenSearch কলটিকে একটি try-catch ব্লকের মধ্যে রাখে:

  • যদি OpenSearch 400 ms-এর মধ্যে ফলাফল দেয়, তবে তা প্রদর্শিত হয়।
  • যদি কলটি কোনো এক্সেপশন (exception) দেয় বা টাইম-আউট অতিক্রম করে, তবে সিস্টেমটি অবিলম্বে SQLite FTS5-এর বিপরীতে কুয়েরিটি পুনরায় চালায়।

এটি নিশ্চিত করে যে নেটওয়ার্ক ল্যাটেন্সি বা সার্ভিস আউটটেজ কখনোই ব্যবহারকারীর অভিজ্ঞতাকে ব্যাহত করবে না। সার্চ ল্যাটেন্সি 20 ms-এর নিচে ছিল।

পরিমাপযোগ্য প্রভাব (Measurable impact)

  • ল্যাটিন-স্ক্রিপ্ট কুয়েরির জন্য জিরো-রেজাল্ট রেট ১১.৪ % থেকে কমে ২.১ % হয়েছে।
  • CJK কুয়েরির জন্য সার্চের মান অপরিবর্তিত রয়েছে, যা নিশ্চিত করে যে নতুন CJK অ্যানালাইজার মূল FTS5 ইনডেক্সের শক্তি বজায় রেখেছে।
  • এন্ড-টু-এন্ড ল্যাটেন্সি ২০ ms লক্ষ্যের নিচে ছিল, যার অর্থ হলো নতুন লেয়ারটি UI-এর গতি কমিয়ে দেয়নি।

শিক্ষা এবং ট্রেড-অফ (Lessons and trade-offs)

  • আলাদা ফোল্ডিং এবং ফাজিনেস – ফোল্ডিং (ক্যারেক্টার নরমালাইজ করা) এবং ফাজিনেস (টাইপো সামলানো) ভিন্ন ভিন্ন সমস্যার সমাধান করে। এগুলোকে আলাদা ফিল্ডে রাখলে অনাকাঙ্ক্ষিত ইন্টারঅ্যাকশন এড়ানো যায়।
  • সার্চ ইনডেক্সকে তথ্যের মূল উৎস (source of truth) হিসেবে গণ্য করবেন না – SQLite মূল স্টোর হিসেবে থাকে; OpenSearch হলো একটি ডেরিভড এবং রিফ্রেশযোগ্য ভিউ। এটি ইনডেক্স ড্রিপ্ট (index drift) প্রতিরোধ করে এবং ব্যর্থতার পর রিকভারি সহজ করে।
  • বুস্ট টিয়ার টিউনিং সহজ করে – সম্পর্কিত ম্যাচগুলোকে একটি একক বুস্ট ফ্যাক্টরের অধীনে গ্রুপ করলে প্যারামিটার অ্যাডজাস্ট করার প্রয়োজনীয়তা কমে যায়।

পরবর্তীতে যা লক্ষ্য রাখতে হবে

এই পরীক্ষাটি প্রমাণ করে যে, SQLite FTS5-এর প্রমাণিত CJK সক্ষমতা বিসর্জন না দিয়েই একটি সামান্য OpenSearch লেয়ার বহুভাষিক ভিডিও শিরোনামের ক্ষেত্রে বানান ভুলের সহনশীলতা নাটকীয়ভাবে উন্নত করতে পারে। যেসব প্ল্যাটফর্মে সার্চের প্রাসঙ্গিকতা সরাসরি ওয়াচ টাইমকে প্রভাবিত করে, সেখানে এই উন্নতি ব্যবহারকারীর অভিজ্ঞতায় একটি দৃশ্যমান সাফল্য বয়ে আনে।