Простые операции поиска
Отредактируйте файл settings.py проекта, добавив django.contrib.postgres в настроечный параметр INSTALLED_APPS, как показано ниже:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog.apps.BlogConfig',
'taggit',
'django.contrib.sites',
'django.contrib.sitemaps',
'django.contrib.postgres',
]
Откройте оболочку Django, выполнив следующую ниже команду в системной командной оболочке:
python manage.py shell
Теперь можно выполнять поиск по одному полю, используя операцию search набора запросов QuerySet.
Выполните следующий ниже исходный код в оболочке Python:
from blog.models import Post
Post.objects.filter(title__search='django')
В этом запросе PostgreSQL используется для того, чтобы создать поисковый вектор для поля title и поисковый запрос из термина django. Результаты получаются путем сопоставления запроса с вектором.
Поиск по нескольким полям
Возможно, вам захочется выполнить поиск по нескольким полям. В этом случае необходимо определить объект SearchVector.
Давайте сформируем вектор, который позволит выполнять поиск по полям title и body модели Post.
Выполните следующий ниже исходный код в оболочке Python:
>>> from django.contrib.postgres.search import SearchVector
>>> from blog.models import Post
>>>
>>> Post.objects.annotate(
... search=SearchVector('title', 'body'),
... ).filter(search='django')
Используя annotate и определяя SearchVector с обоими полями, предоставляется функциональность сопоставления запроса как с заголовком, так и с телом постов.
Полнотекстовый поиск –это интенсивный процесс. Если вы выполняете поиск среди нескольких сотен строк, то вам следует определить функциональный индекс, который сопоставляется с используемым поисковым индексом. Django предоставляет поле SearchVectorField для ваших моделей.
Подробнее об этом можно почитать по адресу https://docs.djangoproject.com/en/4.2/ref/contrib/postgres/search/#performance.