جستجو در Django ORM: از فیلترهای ساده تا Full‑Text Search در PostgreSQL

این مقاله روش‌های مختلف جستجو در Django را بررسی می‌کند: از جستجوهای سادهٔ متنی با contains و icontains، تا استفاده از قابلیت‌های پیشرفتهٔ دیتابیس‌ها مانند unaccent و trigram در PostgreSQL. همچنین توضیح می‌دهد چرا جستجوی مبتنی بر متن برای داده‌های بزرگ ناکارآمد است و چگونه می‌توان از موتورهای جستجوی سندمحور یا Full‑Text Search داخلی PostgreSQL استفاده کرد.

Search، contains، icontains، unaccenttrigram_similar، full text searchSearchVector، PostgreSQL، Django ORM

~2 دقیقه مطالعه · آخرین به‌روزرسانی ۱۹ اسفند ۱۴۰۴

۱. مقدمه

جستجو یکی از رایج‌ترین نیازهای اپلیکیشن‌های وب است. از فیلتر کردن سادهٔ یک لیست گرفته تا جستجوهای پیچیده با وزن‌دهی، هایلایت، پشتیبانی چندزبانه و تحلیل متن. Django ابزارهای مختلفی برای این کار ارائه می‌دهد.

۲. جستجوی متنی ساده

ساده‌ترین روش جستجو استفاده از lookupهای متنی است:


Author.objects.filter(name__contains="Terry")

این روش بسیار شکننده است، زیرا کاربر باید دقیقاً بخشی از نام را بداند. نسخهٔ بهتر:


name__icontains

اما همچنان محدود است.

۳. استفاده از قابلیت‌های پیشرفتهٔ دیتابیس‌ها

اگر از PostgreSQL استفاده می‌کنید، Django ابزارهای قدرتمندی در django.contrib.postgres ارائه می‌دهد.

جستجوی بدون لهجه (unaccent)


Author.objects.filter(name__unaccent__icontains="Helen")

این روش تفاوت‌های لهجه‌ای مانند Hélène را نیز پوشش می‌دهد.

جستجوی trigram

برای شباهت تقریبی بین رشته‌ها:


Author.objects.filter(name__unaccent__lower__trigram_similar="Hélène")

این روش برای نام‌های کوتاه مناسب است، اما برای نام‌های طولانی ممکن است دقت کاهش یابد.

۴. جستجوی سندمحور (Document-based Search)

وقتی متن‌ها طولانی می‌شوند، روش‌های قبلی ناکارآمد هستند. در این حالت باید از موتورهای جستجو استفاده کرد:

  • ElasticSearch
  • Solr
  • و سایر موتورهای full‑text

این ابزارها متن را تحلیل می‌کنند و قابلیت‌هایی مانند موارد زیر دارند:

  • نادیده گرفتن stop words
  • stemming (pony → ponies)
  • وزن‌دهی به کلمات
  • جستجوی چندزبانه

برای استفاده از این موتورها باید داده‌ها را به صورت سند (document) ایندکس کنید.

۵. Full‑Text Search داخلی PostgreSQL

PostgreSQL یک سیستم full‑text search داخلی دارد که Django از آن پشتیبانی می‌کند.

مثال ساده:


Entry.objects.filter(body_text__search="cheese")

جستجو روی چند فیلد و مدل مرتبط:


Entry.objects.annotate(
    search=SearchVector("blog__tagline", "body_text"),
).filter(search="cheese")

این روش سریع، دقیق و قابل ترکیب با Queryهای ORM است.

۶. چه زمانی از کدام روش استفاده کنیم؟

روشمناسب برای
contains / icontainsجستجوهای ساده و کوچک
unaccent / trigramنام‌ها، رشته‌های کوتاه، جستجوی تقریبی
Full‑Text Search PostgreSQLمتن‌های متوسط، نیاز به سرعت بالا
Elastic / Solrمتن‌های بزرگ، جستجوی حرفه‌ای، وزن‌دهی، هایلایت

جمع‌بندی

Django ابزارهای متنوعی برای جستجو ارائه می‌دهد، از ساده‌ترین فیلترهای متنی تا full‑text search پیشرفته. انتخاب روش مناسب به نوع داده، زبان، حجم متن و نیازهای پروژه بستگی دارد. PostgreSQL امکانات قدرتمندی در اختیار شما می‌گذارد، اما برای جستجوهای بسیار پیچیده، استفاده از موتورهای جستجوی سندمحور بهترین گزینه است.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

فریم‌ورک Tasks در Django: راهنمای کامل اجرای کارهای پس‌زمینه در Django 6.0

Django 6.0 فریم‌ورک Tasks را معرفی کرده است؛ سیستمی داخلی برای تعریف و صف‌بندی کارهای پس‌زمینه خارج از چرخهٔ request–response. این مقاله نحوهٔ کار Tasks، پیکربندی backendها، تعریف و enqueue کردن Taskها، استفاده از context، و ادغام با سیستم‌های Worker خارجی را توضیح می‌دهد.

ادامه

پشتیبانی Asynchronous در Django: راهنمای کامل Async Views، ORM، Middleware، عملکرد و ایمنی

این مقاله پشتیبانی Django از برنامه‌نویسی غیرهم‌زمان (async) را توضیح می‌دهد. موضوعاتی مانند async views، اجرای Django تحت ASGI، رفتار middleware، قابلیت‌های ORM غیرهم‌زمان، sync_to_async، مدیریت قطع اتصال، نکات عملکردی، و مکانیزم‌های ایمنی Django برای جلوگیری از استفادهٔ ناامن async بررسی می‌شوند.

ادامه

System Check Framework در Django: راهنمای کامل نوشتن، ثبت، اجرا و تست چک‌های سیستمی

System Check Framework در Django مجموعه‌ای از بررسی‌های استاتیک برای تشخیص مشکلات رایج در پروژه است. این مقاله نحوهٔ اجرای چک‌ها، نوشتن چک‌های سفارشی، مدیریت پیام‌ها، برچسب‌گذاری چک‌ها، افزودن چک به مدل‌ها و فیلدها، و نوشتن تست‌های واحد و یکپارچه برای چک‌ها را توضیح می‌دهد.

ادامه

سیگنال‌ها در Django: راهنمای کامل استفاده، اتصال، ارسال و مدیریت Signalها

این مقاله سیستم سیگنال‌های Django را توضیح می‌دهد؛ مکانیزمی برای اطلاع‌رسانی رویدادها بین بخش‌های مختلف برنامه بدون ایجاد وابستگی مستقیم. موضوعاتی مانند نحوهٔ اتصال receiverها، استفاده از decorator، مدیریت senderهای خاص، محل مناسب قرارگیری کد سیگنال‌ها، هشدارهای مهم، و بهترین شیوه‌ها بررسی می‌شوند.

ادامه

آشنایی کامل با Django Settings: پیکربندی، مدیریت محیط، و بهترین شیوه‌ها

این مقاله یک راهنمای جامع دربارهٔ سیستم تنظیمات در Django ارائه می‌دهد. موضوعاتی مانند ساختار فایل تنظیمات، نحوهٔ تعیین DJANGO_SETTINGS_MODULE، استفاده از settings در کد، امنیت، پیکربندی دستی با configure()، استفادهٔ مستقل از Django با django.setup() و ایجاد تنظیمات سفارشی بررسی می‌شوند.

ادامه

سریال‌سازی و دسریال‌سازی در Django: راهنمای کامل کار با Serialization Framework

این مقاله سیستم سریال‌سازی Django را توضیح می‌دهد؛ از نحوهٔ تبدیل مدل‌ها به JSON، XML، YAML و JSONL گرفته تا دسریال‌سازی داده‌ها، سریال‌سازی فیلدهای انتخابی، کار با مدل‌های ارث‌بری، مدیریت روابط، و نکات مهم هنگام ذخیرهٔ داده‌های دسریال‌شده.

ادامه