ভিডিওটির মূল বিষয়বস্তু এবং স্প্রিং বুট (Spring Boot) ডেমো ইমপ্লিমেন্টেশনের একটি সহজ সারসংক্ষেপ নিচে দেওয়া হলো:
Introduction
এই ভিডিওটিতে মূলত দেখানো হয়েছে যে কীভাবে আমরা বড় কোনো আলাদা সার্চ ইঞ্জিন (যেমন: Elasticsearch) ব্যবহার না করেই শুধুমাত্র PostgreSQL ডাটাবেস দিয়ে উন্নত মানের সার্চ ফাংশনালিটি তৈরি করতে পারি। অনেক সময় ব্যবহারকারী সার্চ করার সময় বানানে ভুল করে বা আংশিক নাম লেখে, যেটাকে আমরা 'Fuzzy Search' বলি। এই ভিডিওতে থমাস গ্রাফেনস্টাইন (Thomas Gräfenstein) দেখিয়েছেন কীভাবে স্প্রিং বুট অ্যাপ্লিকেশনে এই ফাজি সার্চ ইমপ্লিমেন্ট করতে হয় এবং ডাটা পপুলেট করে তা পরীক্ষা করতে হয়।
১. ফাজি সার্চ এবং ট্রাইগ্রাম (Trigrams) এর ধারণা
ভিডিওর শুরুতে মানুষের টাইপিং ভুল এবং নামের বিভিন্নতা (যেমন: Philip বনাম Phillip) নিয়ে আলোচনা করা হয়েছে। এই সমস্যা সমাধানের জন্য PostgreSQL-এর একটি বিশেষ ফিচার হলো Trigram (pg_trgm)।
রেফারেন্স: [11:09]
বিস্তারিত: Trigram হলো একটি শব্দকে ৩ অক্ষরের ছোট ছোট ভাগে ভাগ করার পদ্ধতি। যেমন "HELLO" শব্দটিকে " H", " HE", "HEL", "ELL", "LLO" এভাবে ভাগ করা হয়। যখন আপনি কিছু সার্চ করেন, ডাটাবেস চেক করে দেখে আপনার দেওয়া শব্দের সাথে ডাটাবেসের শব্দের কয়টি ট্রাইগ্রাম মিলছে। এর মাধ্যমে মিলের একটি শতাংশ (Similarity Score) বের করা হয়।
- সহজ ব্যাখ্যা: ধরুন আপনি "Barcelona" সার্চ করতে গিয়ে "Barclona" লিখেছেন। ট্রাইগ্রাম পদ্ধতি দেখবে যে এই দুই শব্দের মধ্যে অনেকগুলো ৩-অক্ষরের অংশ মিল আছে, তাই সে আপনাকে সঠিক রেজাল্টটি দেখাবে। এটাকে 'Error Tolerant' বা ভুল সহ্য করার ক্ষমতা সম্পন্ন সার্চ বলা হয়।
২. স্প্রিং বুট ডেমো: ডাটা পপুলেশন (Populating Data)
ভিডিওর এই অংশে একটি ডেমো স্প্রিং বুট অ্যাপ্লিকেশন দেখানো হয়েছে যেখানে গ্রাহকের (Customer) তথ্য দিয়ে ডাটাবেস পূর্ণ করা হয়েছে।
রেফারেন্স: [25:28] থেকে [27:12]
বিস্তারিত: স্পেকট্রেটরদের দেখানোর জন্য একটি স্ক্রিপ্ট বা ছোট কোডের মাধ্যমে কৃত্রিম কাস্টমার ডাটা (যেমন: নাম, ঠিকানা, কন্টাক্ট নম্বর) ডাটাবেসে ইনসার্ট করা হয়। ভিডিওতে দেখানো হয়েছে যে ডাটাবেস যখন খালি থাকে তখন সার্চ রেজাল্ট আসে না, কিন্তু ডাটা পপুলেট করার পর ভুল বানানে সার্চ করলেও সঠিক ফলাফল পাওয়া যায়।
৩. হাইবারনেট এবং স্প্রিং ডেটা জেপিএ ইমপ্লিমেন্টেশন
যেহেতু ট্রাইগ্রাম সার্চ PostgreSQL-এর একটি এক্সটেনশন, তাই এটি সরাসরি স্প্রিং বুটে কাজ করে না। এর জন্য কিছু কাস্টম কনফিগারেশন করতে হয়।
রেফারেন্স: [28:36] থেকে [32:00]
কোডিং স্নsnippet: হিবারনেটকে নতুন এই সার্চ অপারেটর চেনানোর জন্য একটি FunctionContributor তৈরি করতে হয়:
Kotlin
// Hibernate কে কাস্টম ফাংশন চেনানোর উদাহরণ
class MyFunctionContributor : FunctionContributor {
override fun contributeFunctions(functionContributions: FunctionContributions) {
functionContributions.functionRegistry
.registerPattern("word_similarity", "(?1 %> ?2)")
}
}
ব্যাখ্যা: এই কোডটির মাধ্যমে আমরা হাইবারনেটকে বলছি যে ডাটাবেসে word_similarity নামে একটি বিশেষ কাজ বা ফাংশন আছে যা দিয়ে আমরা সার্চ করতে চাই। এটি ছাড়া স্প্রিং বুট বুঝতে পারবে না কীভাবে PostgreSQL-এর ওই বিশেষ অপারেটরটি ব্যবহার করতে হয়।
৪. সার্চ করার বিভিন্ন পদ্ধতি (JPQL, Native Query, Specification)
সার্চ করার জন্য তিনটি উপায়ের কথা ভিডিওতে বলা হয়েছে:
-
JPQL: এটি সবচেয়ে ভালো পদ্ধতি কারণ এতে কোড পরিষ্কার থাকে।
-
Native Query: সরাসরি SQL লিখে সার্চ করা। এটি সহজ কিন্তু ডাটাবেসের ওপর অনেক বেশি নির্ভরশীল হয়ে পড়ে।
-
Specification (Criteria API): এটি ডাইনামিক সার্চের জন্য ভালো হলেও এতে কিছু সীমাবদ্ধতা (যেমন SQL injection ঝুঁকি বা পারফরম্যান্স ইস্যু) থাকতে পারে।
৫. ইন্ডেক্সিং (Indexing) এবং পারফরম্যান্স
সার্চ দ্রুত করার জন্য PostgreSQL-এ দুই ধরণের ইন্ডেক্স ব্যবহার করা হয়: GiST এবং GIN।
বিস্তারিত:
-
GIN Index: এটি সার্চের জন্য অনেক বেশি দ্রুত (প্রায় ৩ গুণ), কিন্তু এটি ডাটাবেসে অনেক জায়গা নেয় এবং ডাটা আপডেট হতে সময় বেশি লাগে। স্ট্যাটিক বা অপরিবর্তনশীল ডাটার জন্য এটি সেরা।
-
GiST Index: এটি তুলনামূলক ছোট এবং দ্রুত আপডেট হয়, কিন্তু সার্চের সময় GIN এর চেয়ে কিছুটা ধীর। যে ডাটা বারবার পরিবর্তন হয় তার জন্য এটি ভালো।
Analysis & Thinking
বিশ্লেষণ ও আমার চিন্তা: কন্টেন্ট ক্রিয়েটর এখানে একটি বাস্তবসম্মত সমাধান দিয়েছেন। আমাদের প্রায়ই মনে হয় সার্চ মানেই বড় কোনো টুল (Elasticsearch) লাগবে। কিন্তু শুরুতে PostgreSQL-এর এই ট্রাইগ্রাম ফিচার ব্যবহার করলে প্রজেক্টের জটিলতা অনেক কমে যায়।
বাস্তবতা ও সম্ভাবনা:
-
সহজ শুরু: ছোট বা মাঝারি প্রজেক্টে যেখানে খুব বেশি ডাটা নেই, সেখানে আলাদা সার্ভার মেইনটেইন না করে এটি ব্যবহার করাই বুদ্ধিমানের কাজ।
-
বিকল্প: যদি আপনার লক্ষ লক্ষ ডাটা থাকে এবং সার্চের পাশাপাশি লগ অ্যানালাইসিস করতে হয়, তবেই Elasticsearch বা Solr-এ যাওয়া উচিত।
-
পরামর্শ: নতুন ডেভেলপারদের জন্য পরামর্শ হলো, আগে ডাটাবেসের নিজস্ব পাওয়ারফুল ফিচারগুলো শিখুন। ভিডিওতে দেখানো
JPQLপদ্ধতিটি সবচেয়ে নিরাপদ এবং মেইনটেনেবল (সহজেই ঠিকঠাক রাখা যায়)।
সহজ ভাষায় কিছু কঠিন শব্দের অর্থ:
-
Fuzzy Search: অস্পষ্ট বা কাছাকাছি মিল আছে এমন কিছু খুঁজে বের করা।
-
Indexing: বইয়ের সূচিপত্রের মতো, যা ডাটাবেসকে কোনো তথ্য দ্রুত খুঁজে পেতে সাহায্য করে।
-
Boilerplate Code: এমন কোড যা বারবার লিখতে হয় কিন্তু মূল কাজের সাথে সরাসরি যুক্ত নয়।
-
SQL Injection: একটি সাইবার অ্যাটাক যেখানে হ্যাকাররা ইনপুট ফিল্ডে ভুল কোড দিয়ে ডাটাবেস নষ্ট করার চেষ্টা করে।
[
You don't need Elasticsearch! Fuzzy Search with PostgreSQL and Spring Data by Thomas Gräfenstein
Spring I/O · 8.5K views
](http://www.youtube.com/watch?v=2kARdnzB5Gg)

মন্তব্যসমূহ
একটি মন্তব্য পোস্ট করুন
আপনার সমস্যাটি কমেন্ট করে আমাদের জানান :-d