সরাসরি প্রধান সামগ্রীতে চলে যান

PostgreSQL এবং Spring Data ব্যবহার করে সহজ Fuzzy Search

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]

  • অপারেটরগুলো:

    1. Similarity (%): পুরো স্ট্রিংয়ের মধ্যে মিল খোঁজে।

    2. Word Similarity (<%): শব্দের ভেতরে মিল খোঁজে।

    3. 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" নীতি অনুসরণ করা উচিত।

কঠিন শব্দের ব্যাখ্যা:

  1. Fuzzy Search: কাছাকাছি মিল আছে এমন শব্দ খুঁজে বের করা (যেমন: 'ঢাকা' লিখে সার্চ করলে 'ঢাক' খুঁজে পাওয়া)।

  2. Metadata: ডাটা সম্পর্কে তথ্য (যেমন: একটা ফাইলের নাম, সাইজ বা তৈরির তারিখ)।

  3. Paginated Endpoint: যখন অনেক রেজাল্ট থাকে, তখন সব একসাথে না দেখিয়ে পেজ আকারে (১, ২, ৩...) দেখানো।

  4. SQL Injection: হ্যাকিংয়ের একটি পদ্ধতি যেখানে কুয়েরির মাধ্যমে ডাটাবেজ থেকে তথ্য চুরির চেষ্টা করা হয়।

  5. 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)

মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি

সিজ্জিন (Sijjin) vs ইল্লিয়িন (Illiyin) পার্থক্য Difference

Sijjin (سِجِّين) এবং Illiyin (عِلِّيِّين) —এ দুটি শব্দ কুরআনে এসেছে এবং দুটোই মানুষের আমলনামা সংরক্ষণ সম্পর্কিত স্থানকে নির্দেশ করে। ১. সিজ্জিন (Sijjin) সিজ্জিন হলো পাপীদের (কাফের, মুনাফিক ও দুরাচারীদের) আমলনামা সংরক্ষণের স্থান। এটি সাত তলদেশের নীচে এক কারাগার বা অন্ধকার জগতে অবস্থিত বলে উল্লেখ রয়েছে। সূরা আল-মুতাফফিফীন (৮৩:৭-৯) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْفُجَّارِ لَفِي سِجِّينٍ ۝ وَمَا أَدْرَاكَ مَا سِجِّينٌ ۝ كِتَابٌ مَرْقُومٌ" অর্থ: "না, পাপীদের আমলনামা সিজ্জিনে সংরক্ষিত। তুমি কি জানো, সিজ্জিন কী? এটি এক লিখিত দলিল।" সিজ্জিনকে একটি কারাগার, সংকীর্ণ স্থান, বা নিচের স্তরে অবস্থিত এক অন্ধকার দুনিয়া হিসেবে ব্যাখ্যা করা হয়। ২. ইল্লিয়িন (Illiyin) ইল্লিয়িন হলো সৎকর্মশীলদের (মুমিন ও নেককারদের) আমলনামা সংরক্ষণের স্থান । এটি সপ্তম আসমানের ওপরে সংরক্ষিত এক সম্মানিত স্থান। সূরা আল-মুতাফফিফীন (৮৩:১৮-২১) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْأَبْرَارِ لَفِي عِلِّيِّينَ ۝ وَمَا أَدْرَاكَ مَا عِلِّيُّونَ ۝ كِتَابٌ مَرْقُومٌ ۝ يَش...

তারাবিহ সমগ্র - প্রথম আলো

রামাদান ২০২৪ উপলক্ষে প্রথম আলোর নিয়মিত আয়োজন - খতমে তারাবিহ'র সূরা গুলো নিয়ে সংক্ষিপ্ত আলোচনা'র লিংক  নিচে দেওয়া হলো।  লিংকে ক্লিক করলেই আপনাকে আলোচনা তে নিয়ে যাবে। তারাবিহ: ১ | একটি খুন ও গাভি নিয়ে বনি ইসরাইলের বাড়াবাড়ি তারাবিহ: ২ | নারীর মর্যাদা ও অধিকার এবং অলৌকিক তিন ঘটনা তারাবিহ: ৩ | যে ১৪ নারীকে বিয়ে করা হারাম তারাবিতে: ১২ | মহানবী (সা.)–এর আকাশভ্রমণ এবং আসহাবে কাহাফের কাহিনি

রেডমি নোট ৯ এর বিস্তারিত | Redmi Note 9 in Bangla

৩০ এপ্রিল, ২০২০ এ শাওমির ঘোষনা আসে এই ফোনটি নিয়ে। কিন্তু ফোনটি মার্কেটে আসে মে মাসের শেষের দিকে৷ করোনার কারনে ফোনটি বাংলাদেশে আসতে আরো সময় নেয়। বর্তমানে বাংলাদেশে আন অফিশিয়াল ভাবে ফোনটি পাওয়া যাচ্ছে৷ বাংলাদেশে অফিশিয়াল ভাবে এখনো ফোনটি আসার তথ্য নেয়৷ চলুন ফোনটি নিয়ে বিস্তারিত আলোচনা করা যাক। শাওমি নোট সিরিজের ফোন বের করে এদের রেডমি নামে সাব ব্যান্ড৷ এদের কাজ হল এই নোট সিরিজ নিয়ে কাজ করা৷ প্রতিবছর নোট সিরিজের ১/২ টা ফোন বাজারে আসে। সাথে সেই ফোন গুলার বিভিন্ন ভার্সন (যেমন - র‍্যাম ও রমের ভিত্তিতে) বাজারে আসে। এই বছরও তারা রেডমি সিরিজের নোট ৯ বাজারে আনে। এই বছর হয়তো এই সিরিজের আরো ফোন বাজারে আসবে। ডিস্পলেঃ ফোনটির ডিসপ্লে সাইজ ৬.৫৩ ইঞ্চি। এতে আইপিএস এলসিডি ডিসপ্লে ব্যবহার করা হয়েছে। এই ফোনের ডিসপ্লে প্রটেকশন হিসেবে আছে গরিলা গ্লাস ফাইভ। স্ক্রিন আর ফোনের বডির অনুপাত প্রায় ৮৩.৫%। এই ফোনের ডিসপ্লে ফুলএইচডি মানে ১০৮০পি। এই ডিস্পলের দৈর্ঘ্য ১৯.৫ একক এবং প্রস্থ হল ৯ একক। এত বড় ফোনের কারনে এই ফোনের পিপি আই ডেনসিটি ৩৯৫। যা একটু কম। প্লাটফর্মঃ এই ফোনের অপারেটিং সিস্টেম এন্ড্রয়েড ১০ এবং এর...