~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 امکانات قدرتمندی در اختیار شما میگذارد، اما برای جستجوهای بسیار پیچیده، استفاده از موتورهای جستجوی سندمحور بهترین گزینه است.
نوشته و پژوهش شده توسط دکتر شاهین صیامی