Introduction
আজকাল যেকোনো অ্যাপ্লিকেশনে 'সার্চ' অপশনটি খুবই গুরুত্বপূর্ণ। আমরা যখন কোনো কিছু সার্চ করি, তখন বানান ভুল হওয়া বা টাইপিং মিস হওয়াটা খুব স্বাভাবিক। এই ভিডিওতে থমাস গ্রাফেনস্টাইন দেখিয়েছেন কীভাবে আমরা খুব দামি কোনো টুল (যেমন: Elasticsearch) ছাড়াই শুধুমাত্র PostgreSQL ব্যবহার করে স্মার্ট এবং ভুল সহনীয় (Error Tolerant) সার্চ সিস্টেম তৈরি করতে পারি। বিশেষ করে Spring Boot এবং Kotlin/Java ব্যবহার করে কীভাবে এটি ইমপ্লিমেন্ট করা যায়, তা এখানে সহজভাবে বোঝানো হয়েছে।
১. কেন সাধারণ সার্চ (LIKE Operator) যথেষ্ট নয়?
ভিডিওর শুরুতে দেখানো হয়েছে আমরা সাধারণত SQL-এ LIKE বা ILIKE ব্যবহার করে সার্চ করি।
-
রেফারেন্স: [06:15]
-
বিস্তারিত: ধরুন কারো নাম "Philip"। এখন ইউজার যদি ভুল করে "Fillip" লিখে সার্চ করে, তবে
LIKEঅপারেটর কোনো রেজাল্ট দেখাবে না। কারণ এটি হুবহু বা প্যাটার্ন অনুযায়ী ম্যাচ খোঁজে। মানুষের টাইপিং মিস্টেক বা বানানের ভিন্নতা (যেমন: Philip বনাম Philipp) হ্যান্ডেল করার জন্য এটি মোটেও কার্যকর নয়। -
সহজ ব্যাখ্যা (Error Tolerant): এর মানে হলো ইউজার যদি কিছুটা ভুলও লেখে, তবুও সিস্টেম যেন সঠিক বা কাছাকাছি রেজাল্ট খুঁজে দিতে পারে।
২. Trigrams কি এবং এটি কীভাবে কাজ করে?
পোস্টগ্রেসের একটি শক্তিশালী ফিচার হলো Trigram।
-
রেফারেন্স: [11:15]
-
বিস্তারিত: Trigram হলো একটি শব্দকে ৩ অক্ষরের ছোট ছোট ভাগে ভাগ করা। যেমন "HELLO" শব্দটিকে
H,HE,HEL,ELL,LLO,LOএভাবে ভাগ করা হয়। সার্চ করার সময় ইউজার যে শব্দটি লিখছে এবং ডাটাবেজে যা আছে, তাদের মধ্যে কতগুলো Trigram মিলছে তার ওপর ভিত্তি করে একটি Similarity Score (০ থেকে ১ এর মধ্যে) দেওয়া হয়। -
সহজ ব্যাখ্যা (Similarity Score): এটি একটি নাম্বারের মতো। যদি ১ হয় তবে হুবহু মিল, আর যদি ০.৫ হয় তবে অর্ধেক মিল। ১-এর যত কাছাকাছি হবে, রেজাল্ট তত সঠিক।
৩. PostgreSQL-এ সার্চ অপারেটরসমূহ
ভিডিওতে তিনটি প্রধান অপারেটর নিয়ে আলোচনা করা হয়েছে:
-
রেফারেন্স: [14:10]
-
অপারেটরগুলো:
-
Similarity (
%): পুরো স্ট্রিংয়ের মধ্যে মিল খোঁজে। -
Word Similarity (
<%): শব্দের ভেতরে মিল খোঁজে। -
Strict Word Similarity (
<<%): একদম নির্দিষ্ট সীমানার মধ্যে মিল খোঁজে।
-
৪. Spring Data JPA এবং Hibernate-এ ইমপ্লিমেন্টেশন
Spring Boot-এ এই ফিচারটি সরাসরি পাওয়া যায় না, তাই আমাদের Hibernate-কে একটু কাস্টমাইজ করতে হয়।
-
রেফারেন্স: [28:40]
-
কোডিং স্নিকপেট:
Kotlin
// Hibernate Function Contributor
class TrigramFunctionContributor : FunctionContributor {
override fun contributeFunctions(functionContributions: FunctionContributions) {
functionContributions.functionRegistry
.registerPattern("word_similarity", "(?1 <% ?2)")
}
}
ব্যাখ্যা: এই কোডটির মাধ্যমে আমরা Hibernate-কে বলছি যে PostgreSQL-এর <% (Word Similarity) অপারেটরটি কীভাবে ব্যবহার করতে হবে। এর ফলে আমরা সরাসরি JPQL বা Native Query-তে এই ফাংশনটি কল করতে পারি।
৫. সার্চ করার বিভিন্ন পদ্ধতি (JPQL, Native SQL, Specifications)
স্পিকার তিনটি পদ্ধতি দেখিয়েছেন:
-
রেফারেন্স: [30:50]
-
JPQL: এটি সবচেয়ে ভালো কারণ এতে ডাটাবেজের ওপর সরাসরি নির্ভরতা কম থাকে এবং কোড পরিষ্কার থাকে।
-
Native SQL: এটি সরাসরি SQL কুয়েরি লেখার মতো।
-
Specifications (Criteria Builder): এটি ডাইনামিক কুয়েরির জন্য ভালো হলেও, এখানে টাইপ সেফটি বা প্যারামিটার পাস করার ক্ষেত্রে কিছু সীমাবদ্ধতা থাকতে পারে।
-
পরামর্শ: ভিডিও অনুযায়ী JPQL ব্যবহার করা সবচেয়ে সুবিধাজনক।
৬. ইনডেক্সিং (GIN vs GIST)
সার্চ স্পিড বাড়ানোর জন্য ইনডেক্স দরকার।
-
রেফারেন্স: [19:20]
-
GIN Index: এটি সার্চে অনেক দ্রুত (৩ গুণ বেশি), কিন্তু আপডেট হতে সময় নেয় এবং জায়গা বেশি লাগে। স্ট্যাটিক ডাটার জন্য এটি সেরা।
-
GIST Index: এটি সাইজে ছোট এবং দ্রুত আপডেট হয়, কিন্তু সার্চে GIN-এর চেয়ে কিছুটা ধীর। যে ডাটা বারবার পরিবর্তন হয়, সেখানে এটি ব্যবহার করা উচিত।
বিশ্লেষণ ও আমার মতামত (Analysis & Perception)
সারাংশ: কন্টেন্ট ক্রিয়েটর থমাস বোঝাতে চেয়েছেন যে, ছোট বা মাঝারি প্রজেক্টের জন্য হুট করেই Elasticsearch বা Solr-এর মতো জটিল টুল সেটআপ করার দরকার নেই। PostgreSQL-এর pg_trgm এক্সটেনশন ব্যবহার করেই আমরা চমৎকার "Fuzzy Search" সুবিধা দিতে পারি।
বাস্তবতা ও সম্ভাবনা:
-
সহজ সমাধান: যদি আপনার ডাটাবেজে কয়েক লাখ ডাটা থাকে, তবে এই পদ্ধতিটি অসাধারণ কাজ করবে। বাড়তি সার্ভার খরচ বাঁচবে।
-
সীমাবদ্ধতা: যদি আপনার কোটি কোটি ডাটা থাকে এবং র্যাঙ্কিং বা অত্যন্ত জটিল সার্চ লজিক লাগে, তবেই কেবল বড় সার্চ ইঞ্জিনে যাওয়া উচিত।
বিকল্প ও পরামর্শ: বর্তমানে Vector Search বা AI-based search (pgvector) খুব জনপ্রিয় হচ্ছে। তবে সাধারণ বানান ভুল সংশোধনের জন্য Trigram-ই সবচেয়ে সাশ্রয়ী এবং সহজ সমাধান। আমার পরামর্শ হলো, প্রজেক্টের শুরুতে জটিলতায় না গিয়ে এই "Keep it simple" নীতি অনুসরণ করা উচিত।
কঠিন শব্দের ব্যাখ্যা:
-
Fuzzy Search: কাছাকাছি মিল আছে এমন শব্দ খুঁজে বের করা (যেমন: 'ঢাকা' লিখে সার্চ করলে 'ঢাক' খুঁজে পাওয়া)।
-
Metadata: ডাটা সম্পর্কে তথ্য (যেমন: একটা ফাইলের নাম, সাইজ বা তৈরির তারিখ)।
-
Paginated Endpoint: যখন অনেক রেজাল্ট থাকে, তখন সব একসাথে না দেখিয়ে পেজ আকারে (১, ২, ৩...) দেখানো।
-
SQL Injection: হ্যাকিংয়ের একটি পদ্ধতি যেখানে কুয়েরির মাধ্যমে ডাটাবেজ থেকে তথ্য চুরির চেষ্টা করা হয়।
-
Prepared Statement: ডাটাবেজ কুয়েরিকে নিরাপদ করার একটি পদ্ধতি যেখানে ইউজার ইনপুটকে সরাসরি কুয়েরিতে না বসিয়ে আলাদাভাবে পাঠানো হয়।
[
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