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

পোস্টগ্র্যাসকিউএল (PostgreSQL) ব্যবহার করে ফাজি সার্চ এবং স্প্রিং বুট ইমপ্লিমেন্টেশন

ভিডিওটির মূল বিষয়বস্তু এবং স্প্রিং বুট (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)

সার্চ করার জন্য তিনটি উপায়ের কথা ভিডিওতে বলা হয়েছে:

  1. JPQL: এটি সবচেয়ে ভালো পদ্ধতি কারণ এতে কোড পরিষ্কার থাকে।

  2. Native Query: সরাসরি SQL লিখে সার্চ করা। এটি সহজ কিন্তু ডাটাবেসের ওপর অনেক বেশি নির্ভরশীল হয়ে পড়ে।

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

মন্তব্যসমূহ

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

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

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

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

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

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

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