Easy full text search with Django and PostgreSQL. Sane defaults + auto creation of vector fields, indexes, and database triggers.
Extend your model with the SearchableModel
class, and use the SearchableTextField
class to automatically setup full text search:
from django.db.models import TextField
from django_searchable.models import SearchableModel, SearchableTextField
class Blog(SearchableModel):
author_name = TextField() # will NOT have FTS setup automatically
title = SearchableTextField() # will have FTS setup automatically
text = SearchableTextField() # will have FTS setup automatically
Then search away via the Blog manager:
# takes a string of space separated terms
results = Blog.objects.search('spiderman suits')
# or a list of terms
results = Blog.objects.search(['water', 'baskets', 'leaking'])
# or a SearchQuery object
from django.contrib.postgres.search import SearchQuery
query = ~SearchQuery('superman') & SearchQuery('batman')
results = Blog.objects.search(query)
.search
adds a rank
annotation and automatically filters and sorts the resulting queryset.
By default, .search
will search through all SearchableTextField
fields on the model, but you can specify any subset:
results = Blog.objects.search('who is venom', fields=['title'])
pipenv install --dev
createuser -s -P test_user # use 'password'
pipenv run ./manage.py test