containsfilter (or its case-sensitive version,
icontains). The following query can be used to search for posts containing the word
frameworkin the body:
from blog.models import Post.objects.filter(body__contains='framework')
But if you plan to perform complex searches with results that take into account similarities or different weights of fields, you will need a full-text search engine. Django offers a powerful search engine based on the full-text search from PostgreSQL. The
django.contrib.postgres module includes features that PostgreSQL has, but that other Django-supported databases don’t. You can learn more about this search here: https://www.postgresql.org/docs/10/static/textsearch.html. While Django is capable of working with any database, it includes a module that supports a wide range of features from PostgreSQL that other databases supported by Django do not.
Edit your project’s
settings.py file and add the line
INSTALLED_APPS = [ # .. 'django.contrib.postgres', ]
You can now use
search to perform searches:
from blog.models import Post.objects.filter(body__search='django')
This query uses PostgreSQL to create the search direction of the
body field and the search query “django”. The results are based on a mapping between the direction and the query.
Search multiple fields
Sometimes you may need to search multiple fields. In this case, you need to define
a SearchVector. Let’s build a vector that allows you to search in the
body fields of the
from django.contrib.postgres.search import SearchVector from blog.models import Post Post.objects.annotate( search=SearchVector('title', 'body',) ).filter(search='django')
SearchVector for both fields, we get functionality that will search for matches in the title and body of posts.
Full-text search is an intensive process. If it will be performed on more than a few hundred lines, you need to define a functional index that matches the search direction you are using. Django offers a
SearchVectorFieldfor models. Read more about it here: https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/search/#perfomance.