আপনার অ্যাপ্লিকেশনে অনুসন্ধান যুক্ত করা প্রায়শই বিকাশকারীদের ইলাস্টিকসার্চের জন্য পৌঁছায় — তবে PostgreSQL এর শক্তিশালী অন্তর্নির্মিত ফুল-টেক্সট অনুসন্ধান রয়েছে যা অতিরিক্ত অবকাঠামো ছাড়াই বেশিরভাগ প্রয়োজন পরিচালনা করে। এই নির্দেশিকাটি দেখায় কিভাবে PostgreSQL দিয়ে প্রোডাকশন সার্চ তৈরি করতে হয়, বেসিক থেকে র্যাঙ্কিং এবং হাইলাইটিং পর্যন্ত।
📋 Table of Contents
- কেন অনুসন্ধানের জন্য PostgreSQL ব্যবহার করবেন?
- সূচকের সাথে একটি প্রি-কম্পিউটেড tsvector কলাম যোগ করা হচ্ছে
- প্রতিটি প্রশ্নে tsvector কম্পিউটিং ধীর। এটি একটি জিআইএন সূচক সহ একটি কলামে সংরক্ষণ করুন: প্রাসঙ্গিকতা অনুসারে র্যাঙ্কিং ফলাফল
- মিলে যাওয়া শর্তাবলী হাইলাইট করা হচ্ছে
- অস্পষ্ট/টাইপো-সহনশীল অনুসন্ধান যোগ করা হচ্ছে
- এর পরিবর্তে কখন ইলাস্টিকসার্চ ব্যবহার করবেন
- PostgreSQL পূর্ণ-পাঠ্য অনুসন্ধান বেশিরভাগ অ্যাপ্লিকেশন ভালভাবে পরিচালনা করে। আপনার যখন প্রয়োজন তখন ইলাস্টিক সার্চ বিবেচনা করুন:
- জটিল প্রাসঙ্গিক টিউনিং সহ খুব বড় আকারের (শত লক্ষ নথি) উন্নত বৈশিষ্ট্য: মুখী অনুসন্ধান, জটিল সমষ্টি, ভূ-অনুসন্ধান স্কেলে
- আপনার ডাটাবেসের বাইরে অনেক তথ্য উৎস জুড়ে অনুসন্ধান করুন
- উত্তর: ট্রিগ্রাম মিলের জন্য pg_trgm এক্সটেনশন ব্যবহার করুন, যা টাইপো এবং ভুল বানান সহ্য করে। এটিকে পূর্ণ-পাঠ্য অনুসন্ধানের সাথে একত্রিত করুন — প্রধান অনুসন্ধানের জন্য tsvector ব্যবহার করুন এবং একটি ফলব্যাক হিসাবে বা স্বয়ংসম্পূর্ণ/পরামর্শের জন্য ট্রিগ্রামের মিল ব্যবহার করুন।
- . ওজন গুরুত্বপূর্ণ ক্ষেত্রগুলি (যেমন শিরোনাম) সেটওয়েটের সাথে বেশি, এবং নিরাপদ ব্যবহারকারীর ইনপুটের জন্য plainto_tsquery বা websearch_to_tsquery ব্যবহার করুন। খুব বড় স্কেল বা অ্যাডভান্স ফেসেড সার্চের জন্য ইলাস্টিক সার্চ রিজার্ভ করুন। ব্লগ, ই-কমার্স, বিষয়বস্তু সাইট এবং বেশিরভাগ SaaS অ্যাপের জন্য, PostgreSQL অনুসন্ধান সহজ, কোনো অতিরিক্ত পরিকাঠামোর প্রয়োজন নেই, আপনার ডেটার সাথে সামঞ্জস্যপূর্ণ থাকে এবং চমৎকারভাবে পারফর্ম করে — ডেডিকেটেড অনুসন্ধান পরিকাঠামোতে পৌঁছানোর আগে একটি দুর্দান্ত ডিফল্ট পছন্দ।
কেন অনুসন্ধানের জন্য PostgreSQL ব্যবহার করবেন?
- কোন অতিরিক্ত পরিকাঠামো নেই: আপনার বিদ্যমান ডাটাবেস ব্যবহার করুন — চালানো এবং সিঙ্ক করার জন্য আলাদা কোনো সার্চ ইঞ্জিন নেই
- বেশিরভাগ অ্যাপের জন্য যথেষ্ট ভালো: যথাযথ ইন্ডেক্সিং সহ লক্ষ লক্ষ নথি পরিচালনা করে
- লেনদেনের ধারাবাহিকতা: আপনার ডেটা সহ সূচক আপডেট অনুসন্ধান করুন, কোন সিঙ্ক ল্যাগ নেই সমৃদ্ধ বৈশিষ্ট্য:
- র্যাঙ্কিং, স্টেমিং, হাইলাইটিং, একাধিক ভাষা তৈরি করা tsvector এবং tsquery বোঝামৌলিক পূর্ণ-পাঠ্য অনুসন্ধান
সূচকের সাথে একটি প্রি-কম্পিউটেড tsvector কলাম যোগ করা হচ্ছে
-- tsvector: a processed, searchable representation of text
-- tsquery: a search query
SELECT to_tsvector('english', 'The quick brown foxes are jumping');
-- 'brown':3 'fox':4 'jump':6 'quick':2
-- Note: stemming (foxes->fox, jumping->jump) and stopword removal (the, are)
SELECT to_tsvector('english', 'The quick brown foxes')
@@ to_tsquery('english', 'fox');
-- true - matches because 'foxes' stems to 'fox'
প্রতিটি প্রশ্নে tsvector কম্পিউটিং ধীর। এটি একটি জিআইএন সূচক সহ একটি কলামে সংরক্ষণ করুন: প্রাসঙ্গিকতা অনুসারে র্যাঙ্কিং ফলাফল
-- Search articles by title and content
SELECT id, title
FROM articles
WHERE to_tsvector('english', title || ' ' || content)
@@ to_tsquery('english', 'postgresql & search');
-- & means AND, | means OR, ! means NOT
-- plainto_tsquery handles user input safely (treats as AND)
SELECT id, title
FROM articles
WHERE to_tsvector('english', title || ' ' || content)
@@ plainto_tsquery('english', 'postgresql search tutorial');
-- websearch_to_tsquery supports Google-like syntax (quotes, OR, -)
SELECT id, title
FROM articles
WHERE to_tsvector('english', content)
@@ websearch_to_tsquery('english', '"full text" search -elasticsearch');
মিলে যাওয়া শর্তাবলী হাইলাইট করা হচ্ছে
Node.js থেকে এটি ব্যবহার করা
-- Add a generated tsvector column (auto-updates with the data)
ALTER TABLE articles ADD COLUMN search_vector tsvector
GENERATED ALWAYS AS (
to_tsvector('english', coalesce(title, '') || ' ' || coalesce(content, ''))
) STORED;
-- Create a GIN index for fast searching
CREATE INDEX articles_search_idx ON articles USING GIN (search_vector);
-- Now searches are fast and use the index
SELECT id, title FROM articles
WHERE search_vector @@ plainto_tsquery('english', 'postgresql search');
অস্পষ্ট/টাইপো-সহনশীল অনুসন্ধান যোগ করা হচ্ছে
-- ts_rank scores how well each row matches
SELECT id, title,
ts_rank(search_vector, query) AS rank
FROM articles, plainto_tsquery('english', 'postgresql search') query
WHERE search_vector @@ query
ORDER BY rank DESC
LIMIT 20;
-- Weight title matches higher than content
ALTER TABLE articles ADD COLUMN search_vector tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
setweight(to_tsvector('english', coalesce(content, '')), 'B')
) STORED;
-- 'A' weight (title) ranks higher than 'B' weight (content)
এর পরিবর্তে কখন ইলাস্টিকসার্চ ব্যবহার করবেন
-- ts_headline returns snippets with matched terms highlighted
SELECT id, title,
ts_headline('english', content, query,
'StartSel=, StopSel=, MaxWords=35, MinWords=15') AS snippet
FROM articles, plainto_tsquery('english', 'postgresql') query
WHERE search_vector @@ query
ORDER BY ts_rank(search_vector, query) DESC;
-- snippet contains the relevant excerpt with around matches
PostgreSQL পূর্ণ-পাঠ্য অনুসন্ধান বেশিরভাগ অ্যাপ্লিকেশন ভালভাবে পরিচালনা করে। আপনার যখন প্রয়োজন তখন ইলাস্টিক সার্চ বিবেচনা করুন:
app.get('/search', async (req, res) => {
const q = req.query.q;
if (!q) return res.json({ results: [] });
const result = await db.query(`
SELECT id, title,
ts_headline('english', content, query,
'StartSel=,StopSel=,MaxWords=35') AS snippet,
ts_rank(search_vector, query) AS rank
FROM articles, plainto_tsquery('english', $1) query
WHERE search_vector @@ query
ORDER BY rank DESC
LIMIT 20
`, [q]);
res.json({ results: result.rows });
});
জটিল প্রাসঙ্গিক টিউনিং সহ খুব বড় আকারের (শত লক্ষ নথি) উন্নত বৈশিষ্ট্য: মুখী অনুসন্ধান, জটিল সমষ্টি, ভূ-অনুসন্ধান স্কেলে
-- Enable the pg_trgm extension for fuzzy matching (handles typos)
CREATE EXTENSION IF NOT EXISTS pg_trgm;
-- Trigram index for similarity search
CREATE INDEX articles_title_trgm ON articles USING GIN (title gin_trgm_ops);
-- Find titles similar to a (possibly misspelled) query
SELECT title, similarity(title, 'postgres serch') AS sim
FROM articles
WHERE title % 'postgres serch' -- % is the similarity operator
ORDER BY sim DESC;
-- Matches 'PostgreSQL search' despite the typo
আপনার ডাটাবেসের বাইরে অনেক তথ্য উৎস জুড়ে অনুসন্ধান করুন
অনুসন্ধান ডেটার রিয়েল-টাইম বিশ্লেষণ
- বেশিরভাগ অ্যাপের জন্য — ব্লগ, ই-কমার্স, বিষয়বস্তু সাইট, SaaS — PostgreSQL অনুসন্ধান সহজ, কোনো অতিরিক্ত পরিকাঠামোর প্রয়োজন নেই এবং যথেষ্ট বেশি।
- প্রায়শই জিজ্ঞাসিত প্রশ্ন
- প্রশ্ন: PostgreSQL অনুসন্ধান কি যথেষ্ট ভাল, নাকি আমার ইলাস্টিকসার্চ দরকার?
- উত্তর: বেশিরভাগ অ্যাপ্লিকেশনের জন্য, PostgreSQL পূর্ণ-পাঠ্য অনুসন্ধান যথেষ্ট নয় – এটি র্যাঙ্কিং, হাইলাইটিং এবং স্টেমিং সহ লক্ষ লক্ষ নথি পরিচালনা করে। ইলাস্টিকসার্চ ব্যবহার করুন শুধুমাত্র খুব বড় স্কেল, অ্যাডভান্সড ফেসেড সার্চের জন্য বা অনেক ডেটা সোর্স জুড়ে সার্চ করার জন্য। সময়ের আগে ইলাস্টিকসার্চ পরিকাঠামো যোগ করবেন না।
প্রশ্ন: সার্চে টাইপ করার ভুলগুলি আমি কীভাবে পরিচালনা করব?
উত্তর: ট্রিগ্রাম মিলের জন্য pg_trgm এক্সটেনশন ব্যবহার করুন, যা টাইপো এবং ভুল বানান সহ্য করে। এটিকে পূর্ণ-পাঠ্য অনুসন্ধানের সাথে একত্রিত করুন — প্রধান অনুসন্ধানের জন্য tsvector ব্যবহার করুন এবং একটি ফলব্যাক হিসাবে বা স্বয়ংসম্পূর্ণ/পরামর্শের জন্য ট্রিগ্রামের মিল ব্যবহার করুন।
প্রশ্ন: কেন আমার পূর্ণ-পাঠ্য অনুসন্ধান ধীর?
উত্তর: আপনি সম্ভবত একটি সূচী ছাড়াই প্রতিটি ক্যোয়ারীতে to_tsvector কম্পিউট করছেন। একটি GIN সূচক সহ একটি সঞ্চিত জেনারেটেড tsvector কলাম যোগ করুন। এটি অনুসন্ধানযোগ্য উপস্থাপনাকে পূর্বনির্ধারিত করে এবং এমনকি বড় টেবিলেও অনুসন্ধান দ্রুত করে।
প্রশ্ন: plainto_tsquery বনাম to_tsquery বনাম websearch_to_tsquery?
অপারেটর সিনট্যাক্স প্রয়োজন (&, |) — প্রোগ্রাম্যাটিক প্রশ্নের জন্য ভাল।
সরল ব্যবহারকারীর ইনপুট পরিচালনা করে (শব্দগুলিকে এবং হিসাবে ব্যবহার করে) — ব্যবহারকারীর অনুসন্ধান বাক্সগুলির জন্য নিরাপদ।
Google-এর মতো সিনট্যাক্স সমর্থন করে (উদ্ধৃতি, বা, -) — ব্যবহারকারী-মুখী অনুসন্ধানের জন্য সেরা৷
প্রশ্ন: আমি কি একাধিক ভাষায় অনুসন্ধান করতে পারি?
A: to_tsqueryউত্তর: হ্যাঁ — PostgreSQL-এ অনেক ভাষার জন্য টেক্সট সার্চ কনফিগারেশন রয়েছে (ইংরেজি, স্প্যানিশ, ফ্রেঞ্চ, ইত্যাদি) যা প্রতি ভাষা প্রতি স্টেমিং এবং স্টপওয়ার্ড পরিচালনা করে। to_tsvector/to_tsquery-এ ভাষা নির্দিষ্ট করুন। আপনার বিষয়বস্তু বহুভাষিক হলে একটি ভাষা কলাম সংরক্ষণ করুন।plainto_tsqueryউপসংহারwebsearch_to_tsqueryPostgreSQL-এর অন্তর্নির্মিত ফুল-টেক্সট অনুসন্ধান একটি পৃথক সার্চ ইঞ্জিনের জটিলতা ছাড়াই বেশিরভাগ অ্যাপ্লিকেশনের অনুসন্ধানের প্রয়োজনীয়তাগুলি পরিচালনা করে। একটি
ব্যবহার করুন সঞ্চিত জেনারেটেড tsvector কলামের সাথে পারফরম্যান্সের জন্য একটি GIN সূচক, প্রাসঙ্গিকতা র্যাঙ্কিংয়ের জন্য ts_rank, হাইলাইট করার জন্য ts_headline এবং টাইপো টলারেন্সের জন্য pg_trgm
. ওজন গুরুত্বপূর্ণ ক্ষেত্রগুলি (যেমন শিরোনাম) সেটওয়েটের সাথে বেশি, এবং নিরাপদ ব্যবহারকারীর ইনপুটের জন্য plainto_tsquery বা websearch_to_tsquery ব্যবহার করুন। খুব বড় স্কেল বা অ্যাডভান্স ফেসেড সার্চের জন্য ইলাস্টিক সার্চ রিজার্ভ করুন। ব্লগ, ই-কমার্স, বিষয়বস্তু সাইট এবং বেশিরভাগ SaaS অ্যাপের জন্য, PostgreSQL অনুসন্ধান সহজ, কোনো অতিরিক্ত পরিকাঠামোর প্রয়োজন নেই, আপনার ডেটার সাথে সামঞ্জস্যপূর্ণ থাকে এবং চমৎকারভাবে পারফর্ম করে — ডেডিকেটেড অনুসন্ধান পরিকাঠামোতে পৌঁছানোর আগে একটি দুর্দান্ত ডিফল্ট পছন্দ।
. ওজন গুরুত্বপূর্ণ ক্ষেত্রগুলি (যেমন শিরোনাম) সেটওয়েটের সাথে বেশি, এবং নিরাপদ ব্যবহারকারীর ইনপুটের জন্য plainto_tsquery বা websearch_to_tsquery ব্যবহার করুন। খুব বড় স্কেল বা অ্যাডভান্স ফেসেড সার্চের জন্য ইলাস্টিক সার্চ রিজার্ভ করুন। ব্লগ, ই-কমার্স, বিষয়বস্তু সাইট এবং বেশিরভাগ SaaS অ্যাপের জন্য, PostgreSQL অনুসন্ধান সহজ, কোনো অতিরিক্ত পরিকাঠামোর প্রয়োজন নেই, আপনার ডেটার সাথে সামঞ্জস্যপূর্ণ থাকে এবং চমৎকারভাবে পারফর্ম করে — ডেডিকেটেড অনুসন্ধান পরিকাঠামোতে পৌঁছানোর আগে একটি দুর্দান্ত ডিফল্ট পছন্দ।
. ওজন গুরুত্বপূর্ণ ক্ষেত্রগুলি (যেমন শিরোনাম) সেটওয়েটের সাথে বেশি, এবং নিরাপদ ব্যবহারকারীর ইনপুটের জন্য plainto_tsquery বা websearch_to_tsquery ব্যবহার করুন। খুব বড় স্কেল বা অ্যাডভান্স ফেসেড সার্চের জন্য ইলাস্টিক সার্চ রিজার্ভ করুন। ব্লগ, ই-কমার্স, বিষয়বস্তু সাইট এবং বেশিরভাগ SaaS অ্যাপের জন্য, PostgreSQL অনুসন্ধান সহজ, কোনো অতিরিক্ত পরিকাঠামোর প্রয়োজন নেই, আপনার ডেটার সাথে সামঞ্জস্যপূর্ণ থাকে এবং চমৎকারভাবে পারফর্ম করে — ডেডিকেটেড অনুসন্ধান পরিকাঠামোতে পৌঁছানোর আগে একটি দুর্দান্ত ডিফল্ট পছন্দ।. ওজন গুরুত্বপূর্ণ ক্ষেত্রগুলি (যেমন শিরোনাম) সেটওয়েটের সাথে বেশি, এবং নিরাপদ ব্যবহারকারীর ইনপুটের জন্য plainto_tsquery বা websearch_to_tsquery ব্যবহার করুন। খুব বড় স্কেল বা অ্যাডভান্স ফেসেড সার্চের জন্য ইলাস্টিক সার্চ রিজার্ভ করুন। ব্লগ, ই-কমার্স, বিষয়বস্তু সাইট এবং বেশিরভাগ SaaS অ্যাপের জন্য, PostgreSQL অনুসন্ধান সহজ, কোনো অতিরিক্ত পরিকাঠামোর প্রয়োজন নেই, আপনার ডেটার সাথে সামঞ্জস্যপূর্ণ থাকে এবং চমৎকারভাবে পারফর্ম করে — ডেডিকেটেড অনুসন্ধান পরিকাঠামোতে পৌঁছানোর আগে একটি দুর্দান্ত ডিফল্ট পছন্দ।. ওজন গুরুত্বপূর্ণ ক্ষেত্রগুলি (যেমন শিরোনাম) সেটওয়েটের সাথে বেশি, এবং নিরাপদ ব্যবহারকারীর ইনপুটের জন্য plainto_tsquery বা websearch_to_tsquery ব্যবহার করুন। খুব বড় স্কেল বা অ্যাডভান্স ফেসেড সার্চের জন্য ইলাস্টিক সার্চ রিজার্ভ করুন। ব্লগ, ই-কমার্স, বিষয়বস্তু সাইট এবং বেশিরভাগ SaaS অ্যাপের জন্য, PostgreSQL অনুসন্ধান সহজ, কোনো অতিরিক্ত পরিকাঠামোর প্রয়োজন নেই, আপনার ডেটার সাথে সামঞ্জস্যপূর্ণ থাকে এবং চমৎকারভাবে পারফর্ম করে — ডেডিকেটেড অনুসন্ধান পরিকাঠামোতে পৌঁছানোর আগে একটি দুর্দান্ত ডিফল্ট পছন্দ।
🔗 Share this article
✍️ Leave a Comment