يتمتع PostgreSQL بـ بحث نصي كامل مدمج — البحث في المستندات/النصوص عن كلمات مع stemming والترتيب واللغة، أقوى بكثير من LIKE. يستخدم أنواع tsvector (المستند المعالج) و tsquery (استعلام البحث)، مع فهارس GIN للسرعة.
يتمتع PostgreSQL بـ بحث نصي كامل مدمج — البحث في المستندات/النصوص عن كلمات مع stemming والترتيب واللغة، أقوى بكثير من LIKE. يستخدم أنواع tsvector (المستند المعالج) و tsquery (استعلام البحث)، مع فهارس GIN للسرعة.
LIKE '%word%' → no stemming (won't match "running" for "run"), no ranking, no language
awareness, and can't use an index well (leading wildcard) → slow and limited.
Full-text search → stems words, ignores stop words, ranks by relevance, indexable.
-- to_tsvector — process text into searchable lexemes (stemmed, stop-words removed)
SELECT to_tsvector('english', 'The cats are running fast');
-- → 'cat':2 'fast':5 'run':4 (stemmed: cats→cat, running→run; "the"/"are" removed)
-- to_tsquery / plainto_tsquery — parse a search query
SELECT to_tsvector('english', body) @@ to_tsquery('english', 'running')
FROM articles; -- @@ = the match operator; matches "run" stem
to_tsvector يحول النص إلى lexemes معايرة (يقوم بـ stemming للكلمات، يزيل كلمات التوقف)، و to_tsquery يحلل مصطلحات البحث. عامل @@ يختبر التطابق — لذا "running" تطابق المستندات التي تحتوي على "run"، "runs"، إلخ.
-- add a generated tsvector column and index it with GIN
ALTER TABLE articles ADD COLUMN search_vector tsvector
GENERATED ALWAYS AS (to_tsvector('english', title || ' ' || body)) STORED;
CREATE INDEX idx_search ON articles USING GIN (search_vector);
-- fast searches using the index
SELECT title FROM articles
WHERE search_vector @@ plainto_tsquery('english', 'machine learning');
SELECT title, ts_rank(search_vector, query) AS rank
FROM articles, plainto_tsquery('english', 'database') query
WHERE search_vector @@ query
ORDER BY rank DESC; -- most relevant first
ts_rank يسجل مدى توافق كل مستند، مما يتيح نتائج مرتبة حسب الصلة.
البحث النصي الكامل المدمج في PostgreSQL هو ميزة قيّمة تتيح لك تنفيذ وظائف البحث داخل قاعدة البيانات الخاصة بك — بدون الحاجة إلى محرك بحث منفصل (مثل Elasticsearch) للعديد من الحالات — لذا فهمه مفيد للتطبيقات التي تحتاج إلى البحث في النصوص.
القيمة الأساسية هي أنه أقوى بكثير من LIKE (الذي لا يستطيع stemming، ترتيب النتائج، أو الفهرسة بكفاءة): البحث النصي الكامل يوفر stemming الكلمات (مطابقة "running" لـ "run")، إزالة كلمات التوقف، الوعي باللغة، ترتيب الصلة، وبشكل حاسم يكون قابلاً للفهرسة (مع فهارس GIN للبحث السريع) — توفير قدرات بحث حقيقية (النوع الذي يتوقعه المستخدمون: مطابقة تنويعات الكلمات، الترتيب حسب الصلة) مباشرة في Postgres.
فهم المفاهيم الأساسية — tsvector (نص المستند المعالج والمتطور)، tsquery (مصطلحات البحث المحللة)، عامل المطابقة @@، و ts_rank لترتيب الصلة — بالإضافة إلى الإعداد العملي (عمود tsvector مُنتج مفهرس مع GIN للأداء) يغطي كيفية تنفيذ البحث الفعال.
بينما توفر محركات البحث المتخصصة المزيد للاحتياجات المعقدة، البحث النصي الكامل في Postgres كافٍ وملائم للعديد من التطبيقات (تجنب التعقيد التشغيلي لنظام بحث منفصل والحفاظ على اتساق بيانات البحث مع بيانات العلاقات الخاصة بك).
بما أن البحث النصي هو متطلب تطبيق شائع، وبما أن Postgres يوفر بحث نصي كامل قادر (قوي، قابل للفهرسة، مع stemming والترتيب) يكفي غالباً بدون محرك بحث منفصل، فهمه — نموذج tsvector/tsquery، الإعداد المفهرس، والترتيب — معرفة قيّمة وذات صلة عملية تتيح لك إضافة وظائف بحث حقيقية باستخدام قدرات PostgreSQL المدمجة، ميزة مفيدة غالباً ما يتم إغفالها لصالح حلول خارجية أكثر تعقيداً عندما قد يكون Postgres كافياً.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع